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

📄 哈夫曼编码译码器view.cpp

📁 是编译器我花了好几个礼拜才编好的确实难的这是个不错的编译器
💻 CPP
字号:
// 哈夫曼编码译码器View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "哈夫曼编码译码器.h"

#include "哈夫曼编码译码器Doc.h"
#include "哈夫曼编码译码器View.h"

#include "MyDiag.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif




/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_COMMAND(ID_MENUITEM_ENCODE, OnMenuitemEncode)
	ON_COMMAND(ID_MENUITEM_TRAN, OnMenuitemTran)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	extern CHuffmanTree theTree;
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	DrawTree(theTree,pDC);
	DrawOtherInfo(theTree,pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}


void CMyView::DrawTree(CHuffmanTree & pTree,CDC* pDC){

	AnalyzeTree();
	if(pTree.IsEmpty()) {
		AfxMessageBox("CMyView::DrawTree !树为空!");
		return;
	}
	DrawTreNode(pTree.m_pRoot,m_nHorizoDista,m_nLeverDista,1,m_nHorizoDista/2,pDC);

}

void CMyView::DrawTreNode(CBinTreNode<int> *pNode,int x,int y,int nLeverNow,int nHoriDisNow, CDC* pDC){


	pDC->Ellipse(x - 10, y - 5, x + 20 , y + 20);
	CString strNode;
	strNode.Format("%d",pNode->m_MData);
	pDC->TextOut(x,y,strNode);



	int nTemY = m_nLeverDista * (nLeverNow + 1);

	if(pNode->m_pLefC != NULL){
		pDC->MoveTo(x+3,y+20);
		pDC->LineTo(x - nHoriDisNow,nTemY-5);
		DrawTreNode(pNode->m_pLefC,x - nHoriDisNow,nTemY,nLeverNow+1,nHoriDisNow /2 ,pDC);
	}
	if(pNode->m_pRigC != NULL){
		pDC->MoveTo(x+3,y+20);
		pDC->LineTo(x + nHoriDisNow,nTemY-5);
		DrawTreNode(pNode->m_pRigC,x + nHoriDisNow,nTemY,nLeverNow+1,nHoriDisNow /2 ,pDC);
	}


}

void CMyView::AnalyzeTree(){			//注意树不能为空
	extern CHuffmanTree theTree;
	AnalyzeNode(theTree.m_pRoot,1);

    CRect rect;
    GetClientRect (&rect);
	
	m_nLeverDista = rect.Height() /(m_nTreeLever + 2);
	m_nHorizoDista = rect.Width() /2;


}

void CMyView::AnalyzeNode(CBinTreNode<int> *pNode,int nLeverNow){

	if(pNode->m_pLefC != NULL){
		if(m_nTreeLever < nLeverNow+1) m_nTreeLever = nLeverNow+1;
		AnalyzeNode(pNode->m_pLefC,nLeverNow+1);
	}

	if(pNode->m_pRigC != NULL){
		if(m_nTreeLever < nLeverNow+1) m_nTreeLever = nLeverNow+1;
		AnalyzeNode(pNode->m_pRigC,nLeverNow+1);
	}


}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::OnMenuitemEncode() 
{
	// TODO: Add your command handler code here
	extern CHuffmanTree theTree;
	// TODO: Add your command handler code here
	CMyDiag myDiag;
	myDiag.m_strHelp = "请输入要编码的正文";
	if(myDiag.DoModal() == IDOK){
//		AfxMessageBox(myDiag.m_strInput);
		if(myDiag.m_strInput.GetLength() > 50 ){
			AfxMessageBox("输入正文长度大于50!");
		}
		else{
			theTree.SetContent(LPCTSTR(myDiag.m_strInput));
			theTree.Encode();
			Invalidate ();
		}
	}
	
}

void CMyView::DrawOtherInfo(CHuffmanTree & pTree,CDC* pDC){

    CRect rect;
    GetClientRect (&rect);
	
	CString cstrTem = "要编码的正文是:" ,cstrTem2;
	cstrTem += pTree.m_strConSent.data();
	pDC->TextOut(10,10,cstrTem);
	cstrTem = "各字符及其出现次数(概率)为: ";
	pDC->TextOut(10,30,cstrTem);

	cstrTem = "";
	int i=0,j=0;
	for(i=0;i<pTree.m_nCharNum;i++){
		cstrTem2 = "";
		cstrTem += pTree.m_strConChar[i];
		cstrTem2.Format("%d, ",pTree.m_arrCharProbability[i]);
		cstrTem += cstrTem2;
	}
	pDC->TextOut(10,50,cstrTem);
	cstrTem = "各字符的编码为: ";
	
	list<bool>::iterator myIter;
	for(i=0;i<pTree.m_nCharNum;i++){
		cstrTem += pTree.m_strConChar[i];
		cstrTem += " ";
		for(myIter = pTree.m_arrCharCode[i].begin();myIter != pTree.m_arrCharCode[i].end();myIter++){
			cstrTem += (*myIter == true ? '1' : '0');
		}
		cstrTem += ", ";
	}
	pDC->TextOut(10,rect.Height() - 60,cstrTem);

	cstrTem = "最终的正文编码为: ";
	pDC->TextOut(10,rect.Height() - 40,cstrTem);
	
	cstrTem = "";
	cstrTem.Format("编码长度为%d",pTree.m_lisTranCode.size());
	pDC->TextOut(150,rect.Height() - 40,cstrTem);

	cstrTem = "";
	for(myIter = pTree.m_lisTranCode.begin();myIter != pTree.m_lisTranCode.end();myIter++ ){
		cstrTem += (*myIter == true ? '1' : '0');
	}
	pDC->TextOut(10,rect.Height() - 20,cstrTem);
	
	cstrTem = "编码的译文为:";
	cstrTem += pTree.m_strConReci.data();
	pDC->TextOut(250,rect.Height() - 40,cstrTem);
}

void CMyView::OnMenuitemTran() 
{
	// TODO: Add your command handler code here
	extern CHuffmanTree theTree;
	theTree.Decode();
	Invalidate ();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -