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

📄 ppmd_mfcdlg.cpp

📁 PPMD是一种强有力的压缩算法。这是PPMD算法的windows下的源码
💻 CPP
字号:
// PPMD_MFCDlg.cpp : implementation file
//

#include "stdafx.h"
#include "PPMD_MFC.h"
#include "PPMD_MFCDlg.h"

#include "ppmd_coder.h"

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

/////////////////////////////////////////////////////////////////////////////
// CPPMD_MFCDlg dialog

CPPMD_MFCDlg::CPPMD_MFCDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPPMD_MFCDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPPMD_MFCDlg)
	m_Input = _T("");
	m_Memory = 8;
	m_Order = 6;
	m_Output = _T("");
	m_Statistic = _T("");
	m_RatioNumber = _T("");
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CPPMD_MFCDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPPMD_MFCDlg)
	DDX_Control(pDX, IDC_MEMORY_SCROLL, m_MemoryScroll);
	DDX_Control(pDX, IDC_ORDER_SCROLL, m_OrderScroll);
	DDX_Control(pDX, IDC_PROGRESS, m_RatioProgress);
	DDX_Control(pDX, IDC_UNCOMPRESS, m_Uncompress);
	DDX_Control(pDX, IDC_COMPRESS, m_Compress);
	DDX_Text(pDX, IDC_INPUT, m_Input);
	DDX_Text(pDX, IDC_MEMORY, m_Memory);
	DDV_MinMaxInt(pDX, m_Memory, 1, 256);
	DDX_Text(pDX, IDC_ORDER, m_Order);
	DDV_MinMaxInt(pDX, m_Order, 1, 16);
	DDX_Text(pDX, IDC_OUTPUT, m_Output);
	DDX_Text(pDX, IDC_STATISTIK, m_Statistic);
	DDX_Text(pDX, IDC_RATIO_NUMBER, m_RatioNumber);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPPMD_MFCDlg, CDialog)
	//{{AFX_MSG_MAP(CPPMD_MFCDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	ON_BN_CLICKED(IDC_COMPRESS, OnCompress)
	ON_BN_CLICKED(IDC_UNCOMPRESS, OnUncompress)
	ON_WM_VSCROLL()
	ON_EN_CHANGE(IDC_INPUT, OnChangeInput)
	ON_EN_CHANGE(IDC_OUTPUT, OnChangeOutput)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPPMD_MFCDlg message handlers

BOOL CPPMD_MFCDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	m_RatioProgress.SetRange(0, 100);
	m_Compress.EnableWindow(FALSE);
	m_Uncompress.EnableWindow(FALSE);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// 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 CPPMD_MFCDlg::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();
	}
}

HCURSOR CPPMD_MFCDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CPPMD_MFCDlg::OnBrowse() 
{
	UpdateData();

	CFileDialog cf(TRUE, NULL, _T("*.*"), 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST,
		_T("All files (*.*)|*.*||"));
	if (cf.DoModal() == IDOK)
	{
		// get choosen file
		m_Input = cf.GetPathName();
		
		// PPM extension - prepare for uncompression
		if (cf.GetFileExt().CompareNoCase("ppm") == 0)
		{
			m_Output = m_Input.Left(m_Input.GetLength()-4);
			m_Compress.EnableWindow(FALSE);
			m_Uncompress.EnableWindow();
		}
		else
		{
			// Default output filename = filename + .ppm
			m_Output = m_Input;
			m_Output += _T(".ppm");

			m_Compress.EnableWindow();
			m_Uncompress.EnableWindow(FALSE);		
		}

		UpdateData(FALSE);
	}
}

void CPPMD_MFCDlg::OnCompress() 
{
	if (!UpdateData())
		return;

	// The code for the compression is almost trivial. Setup all
	// parameters, start the coder with "Compress()" and retrieve
	// some statistical information.
	PPMD_Coder ppmd(m_Input, m_Output, m_Memory, m_Order);

	CWaitCursor waiter;

	try
	{
		ppmd.Compress();

		// Now the file is compressed.
		DWORD m1, m2;
		ppmd.GetMemoryUsage(m1, m2);

		m_Statistic.Format(_T("Input filesize:\t%i Bytes\nOutput filesize:\t%i Bytes\n"
			"Bytes saved:\t%i\nMemory used:\t%i.%i MBytes"), 
			ppmd.GetInputSize(), ppmd.GetOutputSize(),
			ppmd.GetInputSize() - ppmd.GetOutputSize(),
			m1, m2);

		m_RatioProgress.SetPos(ppmd.GetRatio());
		m_RatioNumber.Format(_T("%2.2f"), ppmd.GetRatio());
		UpdateData(FALSE);
	}
	catch (exception &e)
	{
		waiter.Restore();

		MessageBox(e.what());
		m_RatioProgress.SetPos(0);
	}
}

void CPPMD_MFCDlg::OnUncompress() 
{
	if (!UpdateData())
		return;

	// Uncompression is as simple as compression.
	PPMD_Coder ppmd(m_Input, m_Output, m_Memory);

	CWaitCursor waiter;

	try
	{
		ppmd.Uncompress();
		DWORD m1, m2;
		ppmd.GetMemoryUsage(m1, m2);

		m_Statistic.Format(_T("Input filesize:\t%i Bytes\nOutput filesize:\t%i Bytes\n"
			"Bytes saved:\t%i\nMemory used:\t%i.%i MBytes"), 
			ppmd.GetInputSize(), ppmd.GetOutputSize(),
			ppmd.GetOutputSize() - ppmd.GetInputSize(),
			m1, m2);

		m_RatioNumber.Format(_T("%2.2f"), ppmd.GetRatioUncompressed());
		m_RatioProgress.SetPos(ppmd.GetRatioUncompressed());
		UpdateData(FALSE);
	}
	catch (exception &e)
	{
		waiter.Restore();

		MessageBox(e.what());
		m_RatioProgress.SetPos(0);

	}
}

// User has clicked on the scrollbars 
void CPPMD_MFCDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	UpdateData();

	if (pScrollBar == &m_OrderScroll)
	{
		if (nSBCode == SB_LINEDOWN )
		{
			m_Order = max(m_Order-1, 2);
		}
		else if (nSBCode == SB_LINEUP)
		{
			m_Order = min(m_Order+1, 16);
		}
	}
	else if (pScrollBar == &m_MemoryScroll)
	{
		if (nSBCode == SB_LINEDOWN )
		{
			m_Memory = max(m_Memory-1, 1);
		}
		else if (nSBCode == SB_LINEUP)
		{
			m_Memory = min(m_Memory+1, 256);
		}
	}


	
	UpdateData(FALSE);
	
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

// Editcontrol "Input file"  has changed. 
// Check if data is valid and enable/disable buttons.
void CPPMD_MFCDlg::OnChangeInput() 
{
	UpdateData();
	
	m_Compress.EnableWindow(!m_Input.IsEmpty());
	m_Uncompress.EnableWindow(!m_Input.IsEmpty());
}

// Editcontrol "Output file" has changed.
void CPPMD_MFCDlg::OnChangeOutput() 
{
	OnChangeInput();	
}

⌨️ 快捷键说明

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