📄 huffmandlg.cpp
字号:
pDlg->End();
while(!pDlg->m_bKill)
{
if(!pDlg->m_bKill)
::WaitForSingleObject(pDlg->m_DecodeEvent,INFINITE);
m_HuffCode.Decode(pDlg->m_sCode,pDlg->m_sDecode);
AfxMessageBox("解码结果:"+pDlg->m_sDecode);
pDlg->m_DecodeEvent.ResetEvent();
}
pDlg->m_Demo.detach();
return 0;
}
void CHuffmanDlg::OnStep()
{
if(m_Length==0)
{
MessageBox("请先输入数据!");
return ;
}
if(m_bIsStart==FALSE)
{
// m_Event1.SetEvent();
StartThread();
m_bIsStart=TRUE;
}
m_Stop.EnableWindow(FALSE);
m_Mode=0;//单步
m_bStep=TRUE;
m_Pause=FALSE;
}
void CHuffmanDlg::OnStop()
{
// m_Thread.Kill();
// m_bIsStart=FALSE;
m_Pause=TRUE;
GetDlgItem(IDC_AUTO)->EnableWindow(TRUE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
GetDlgItem(IDC_STEP)->EnableWindow(TRUE);
}
void CHuffmanDlg::End()
{
if(m_bIsStart)
MessageBox("演示完毕","哈夫曼编码");
GetDlgItem(IDC_AUTO)->EnableWindow(TRUE);
GetDlgItem(IDC_STEP)->EnableWindow(TRUE);
m_bEndEncode=TRUE;
// m_bIsStart=FALSE;
}
void CHuffmanDlg::StartThread()
{
m_bKill=FALSE;
m_pThread=AfxBeginThread(DemoProc,this);
}
void CHuffmanDlg::Reset()
{
m_bStep=FALSE;
m_Pause=FALSE;
m_bIsStart=FALSE;
m_bKill=TRUE;
m_bEndEncode=FALSE;
HANDLE hThread=m_pThread->m_hThread;
m_SrcList.SetCurSel(0);
m_Auto.EnableWindow(TRUE);
m_Step.EnableWindow(TRUE);
::WaitForSingleObject(hThread,500);
// m_HuffCode.Clear();
m_Demo.Invalidate();
StartThread();
}
void CHuffmanDlg::InitData()
{
m_SrcPasscle="PROC huffman_code(w:ARRAY[1..n] OF integer;VAR ht:huftree;VAR hcd:hufcode);\n";
m_SrcPasscle+="{w中存放n个字符的权值,ht表示哈夫曼树,hcd存放n个字符的哈夫曼编码}\n";
m_SrcPasscle+=" FOR i:=1 TO m Do[ht[i].parent:=0;ht[i].lch:=0;ht[i].rch:=0];{初试化}\n";
m_SrcPasscle+=" FOR i:=1 TO n DO ht[i].weight:=w[i];\n";
m_SrcPasscle+=" FOR i:=n+1 TO m DO \n";
m_SrcPasscle+=" [ select(i-1,s1,s2);\n";
m_SrcPasscle+=" {在ht[k](1<=k<=i-1)中选择两个起双亲域为零而权值最小的结点,它们在ht中的序号分别为s1,s2}\n";
m_SrcPasscle+=" ht[s1].parent:=i;ht[s2].parent:=i;ht[i].lch:=s1;ht[i].rch:=s2;\n";
m_SrcPasscle+=" ht[i].weight:=ht[s1].weight+ht[s2].weight\n";
m_SrcPasscle+=" ]\n";
m_SrcPasscle+=" FOR i:=1 TO n DO\n";
m_SrcPasscle+=" [ cd.start:=n;\n";
m_SrcPasscle+=" c:=i;f:=ht[c].parent;\n";
m_SrcPasscle+=" WHILE f!=0 DO\n";
m_SrcPasscle+=" [ IF ht[f].lch:=c THEN cd.bits[cd.start]:=0\n";
m_SrcPasscle+=" ELSE cd.bits[cd.start]:=1;\n";
m_SrcPasscle+=" cd.start:=cd.start-1;c:=f;f:=ht[f].parent;\n";
m_SrcPasscle+=" ];\n";
m_SrcPasscle+=" hcd[i]:=cd{记录赋值}\n";
m_SrcPasscle+=" ]\n";
m_SrcPasscle+="ENDP;{huffman_code}\n";
}
void CHuffmanDlg::AddPasscleSrc()
{
/* m_SrcList.SetItemHeight(20);
m_SrcList.AddItem("First string");
m_SrcList.AddItem("Last string");
m_SrcList.InsertItem("Middle string #1", 1, RGB(50, 100, 150), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, RGB(100, 150, 200), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, RGB(150, 200, 250), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, RGB(200, 250, 0), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, RGB(250, 0, 50), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, RGB(100, 50, 100), RGB(255, 255,255));
m_SrcList.InsertItem("Middle string #1", 1, 12432321, RGB(255, 255,255));
// m_SrcList.SetActive(FALSE, 2);
m_SrcList.SetCurSel(0);
/* m_SrcList.SetItemHeight(10);*/
CString str;
int index=0;
for(int i=0;i<m_SrcPasscle.GetLength();i++)
{
if(m_SrcPasscle.GetAt(i)=='\n')
{
/*if(index==0)
{
m_SrcList.AddItem(str,RGB(0,255,0),RGB(0,0,255));
index++;
}*/
//else
m_SrcList.AddString(str);//.InsertItem(str,index++,RGB(0,255,0),RGB(0,0,255));
str.Empty();
}
else str+=m_SrcPasscle.GetAt(i);
}
m_SrcList.SetCurSel(0);//*/
}
void CHuffmanDlg::OnAuto()
{
if(m_Length==0)
{
MessageBox("请先输入数据!");
return ;
}
if(m_bIsStart==FALSE)
{
StartThread();
m_bIsStart=TRUE;
}
m_Auto.EnableWindow(FALSE);
m_Step.EnableWindow(FALSE);
m_Stop.EnableWindow(TRUE);
m_Mode=1;//自动执行
m_Pause=FALSE;
}
void CHuffmanDlg::OnOption()
{
COptionDlg dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Speed==0)
m_Wait=1200;
else if(dlg.m_Speed==1)
m_Wait=800;
else if(dlg.m_Speed==2)m_Wait=500;
else m_Wait=250;
}
}
void CHuffmanDlg::OnOK()
{
CDialog::OnOK();
}
void CHuffmanDlg::OnDestroy()
{
m_bKill=TRUE;
m_bIsStart=FALSE;
m_DecodeEvent.SetEvent();
if(m_pThread)
{
HANDLE hThread=m_pThread->m_hThread;
::WaitForSingleObject(hThread,1000);
}
CDialog::OnDestroy();
}
void CHuffmanDlg::LoadPictureFile( LPCTSTR szFile, CBitmap* pBitmap, CSize& mSize)
{
// open file
HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox("载入图片出错,请确认程序当前目录下有bmp文件夹!");
OnOK();
return;
}
// _ASSERTE(INVALID_HANDLE_VALUE != hFile);
// get file size
DWORD dwFileSize = GetFileSize(hFile, NULL);
if(dwFileSize==-1)
{
AfxMessageBox("载入图片出错,请确认程序当前目录下有bmp文件夹!");
OnOK();
return;
}//_ASSERTE(-1 != dwFileSize);
LPVOID pvData = NULL;
// alloc memory based on file size
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
_ASSERTE(NULL != hGlobal);
pvData = GlobalLock(hGlobal);
_ASSERTE(NULL != pvData);
DWORD dwBytesRead = 0;
// read file and store in global memory
BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
_ASSERTE(FALSE != bRead);
GlobalUnlock(hGlobal);
CloseHandle(hFile);
LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
_ASSERTE(SUCCEEDED(hr) && pstm);
// Create IPicture from image file
LPPICTURE gpPicture;
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture);
_ASSERTE(SUCCEEDED(hr) && gpPicture);
pstm->Release();
OLE_HANDLE m_picHandle;
gpPicture->get_Handle(&m_picHandle);
pBitmap->DeleteObject();
pBitmap->Attach((HGDIOBJ) m_picHandle);
BITMAP bm;
GetObject(pBitmap->m_hObject, sizeof(bm), &bm);
mSize.cx = bm.bmWidth; //nWidth;
mSize.cy = bm.bmHeight; //nHeight;
}
CString CHuffmanDlg::getPath()
{
TCHAR Path[MAX_PATH];
::GetModuleFileName(NULL,Path,MAX_PATH);
CString sPath(Path);
TCHAR szPath[_MAX_PATH];
LPTSTR lpszName;
GetFullPathName(sPath, _MAX_PATH, szPath, &lpszName);
CString mPath = szPath;
int p = mPath.Find(lpszName, 0);
if (p > -1)
{
mPath.Delete(p, strlen(lpszName));
}
p = mPath.GetLength() - 1;
if(mPath.GetAt(p) == '\\')
mPath.Delete(p, 1);
return mPath + '\\';
}
void CHuffmanDlg::AdjustWindow()
{
LoadPictureFile(m_BmpFile+"bmp\\back.jpg",&m_bmpBK,m_BkSize);
int cx=800;//::GetSystemMetrics(SM_CXSCREEN);
int cy=600;//::GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTop,0,0,cx,cy,SWP_NOMOVE);
CRect rect=CRect(0,0,cx,cy);
m_Demo.MoveWindow(CRect(15,100,cx-250,cy-40));
m_SrcList.MoveWindow(CRect(cx-230,140,cx-20,cy-245));
m_Code.MoveWindow(CRect(cx-235,110,cx-15,cy-240));
m_StateList.MoveWindow(CRect(cx-230,cy-215,cx-20,cy-40));
m_Tree.MoveWindow(CRect(cx-235,cy-240,cx-15,cy-35));
/* m_CodeState.MoveWindow(CRect(cx-220,cy-225,cx-20,cy-40));
m_EnCode.MoveWindow(CRect(cx-225,cy-250,cx-15,cy-35));
m_CodeState.ShowWindow(SW_HIDE);
m_EnCode.ShowWindow(SW_HIDE);*/
}
void CHuffmanDlg::OnDecode()
{
if(!m_bIsStart||!m_bEndEncode)
{
MessageBox("编码还没完成!","数据结构演示");
return;
}
CDecodeDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_sCode=dlg.m_editCode;
m_DecodeEvent.SetEvent();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -