📄 ppmd_mfcdlg.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 + -