📄 huffmandlg.cpp
字号:
// HUFFMANDlg.cpp : implementation file
//
#include "stdafx.h"
#include "HUFFMAN.h"
#include "HUFFMANDlg.h"
#include "HUFFMANCODE.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int itemdel;//被选中的行号,删除指定行时用
int listinsize,listoutsize;//输入列表和输出列表的行数
CString sFilePath;//输入文件的路径
node *head,*rear,*currptr,*currptr1,*prevptr,*head1,*rear1;
node *root,*min[2];
void PreOrder(node *t);//先根遍历进行编码
void PreOrderto0(node *t);//先根遍历初始化树的编码
int findsign(CString str,node *t);//在t根的树中查找sign为str的点,并用currptr1指向找到的点
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHUFFMANDlg dialog
CHUFFMANDlg::CHUFFMANDlg(CWnd* pParent /*=NULL*/)
: CDialog(CHUFFMANDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CHUFFMANDlg)
m_sign = _T("");
m_probablility = 0.0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CHUFFMANDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CHUFFMANDlg)
DDX_Control(pDX, IDC_LIST_OUT, m_LISTOUT);
DDX_Control(pDX, IDC_LIST_IN, m_LISTIN);
DDX_Text(pDX, IDC_EDIT_SIGN, m_sign);
DDX_Text(pDX, IDC_EDIT_PRO, m_probablility);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CHUFFMANDlg, CDialog)
//{{AFX_MSG_MAP(CHUFFMANDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST_IN, OnItemclickListIn)
ON_NOTIFY(NM_CLICK, IDC_LIST_IN, OnClickListIn)
ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
ON_BN_CLICKED(IDC_BUTTON_NEW, OnButtonNew)
ON_BN_CLICKED(IDC_BUTTON_INFILE, OnButtonInfile)
ON_BN_CLICKED(IDC_BUTTON_DELALL, OnButtonDelall)
ON_BN_CLICKED(IDC_BUTTON_REDO, OnButtonRedo)
ON_BN_CLICKED(IDC_BUTTON_CODE, OnButtonCode)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHUFFMANDlg message handlers
BOOL CHUFFMANDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
itemdel=-1;
//设置输出表的样式、列的标题
m_LISTIN.SetExtendedStyle (LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES |LVS_EX_INFOTIP);
m_LISTIN.InsertColumn(0,"符号",LVCFMT_LEFT,50);
m_LISTIN.InsertColumn(1,"概率",LVCFMT_LEFT,95);
m_LISTOUT.SetExtendedStyle (LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES |LVS_EX_INFOTIP);
m_LISTOUT.InsertColumn(0,"符号",LVCFMT_LEFT,50);
m_LISTOUT.InsertColumn(1,"编码",LVCFMT_LEFT,195);
listinsize=0;
listoutsize=0;
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CHUFFMANDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CHUFFMANDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CHUFFMANDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CHUFFMANDlg::OnItemclickListIn(NMHDR* pNMHDR, LRESULT* pResult)
{
AfxMessageBox("fjkdfsdfgdsfgfdsk");
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
//得到所选行
void CHUFFMANDlg::OnClickListIn(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_LISTIN.ScreenToClient(&point);
LVHITTESTINFO lvinfo;
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_LISTIN.SubItemHitTest(&lvinfo);
if(nItem != -1)
{
//使itemdel等于被选的行
CString strtemp;
itemdel=lvinfo.iItem;
}
*pResult = 0;
}
//删除选定的项
void CHUFFMANDlg::OnButtonDel()
{
// TODO: Add your control notification handler code here
//删除head1指向的链表
node *temp;
while(head1!=NULL)
{
temp=head1;
head1=head1->next;
delete temp;
}
//从列表中删除选定的项,并删除对应结点
if(itemdel!=-1)
{
currptr=head;
CString str=m_LISTIN.GetItemText(itemdel,0);
while(currptr->sign!=str&&currptr!=NULL)
{
prevptr=currptr;
currptr=currptr->next;
}
if(currptr==head)
{
head=head->next;
delete currptr;
}
else if(currptr==rear)
{
rear=prevptr;
rear->next=NULL;
delete currptr;
}
else
{
prevptr->next=currptr->next;
delete currptr;
}
m_LISTIN.DeleteItem(itemdel);
listinsize=listinsize-1;
listoutsize=0;
itemdel=-1;
}
else
MessageBox("请选中要删除的字符","错误",MB_OK);
}
//键入新信源符号
void CHUFFMANDlg::OnButtonNew()
{
// TODO: Add your control notification handler code here
//读取编辑框数据
UpdateData(TRUE);
if(m_probablility>1||m_probablility<0)
{
MessageBox("概率必须大于0且小于1,请重新输入","错误");
return;
}
if(m_sign=="")
{
MessageBox("请输入信源符号","错误");
return;
}
CHUFFMANDlg::rearadd(m_sign,m_probablility);
CHUFFMANDlg::OnButtonRedo();
}
//在链尾加入结点
void CHUFFMANDlg::rearadd(CString str,double pro)
{
currptr=head;
while(currptr!=NULL)
{
if(currptr->sign==str)
{
MessageBox("对不起,此符号已存在,输入无效");
return;
}
currptr=currptr->next;
}
node *temp=new node;
if(head==NULL)
{
head=temp;
rear=head;
prevptr=head;
currptr=head;
currptr->sign=str;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -