⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffmandlg.cpp

📁 哈夫曼编码解码演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -