📄 maindlg.h
字号:
// MainDlg.h : interface of the CMainDlg class
//
/////////////////////////////////////////////////////////////////////////////
#ifndef UNZLIB_MAIN_DLG_H
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
public CMessageFilter, public CIdleHandler
{
private:
bool mOkEnable;
public:
enum { IDD = IDD_MAINDLG };
enum { BUFF_SIZE = (1 << 14) }; // inflate(), deflate()偵搉偡僶僢僼傽偺僒僀僘
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
return CWindow::IsDialogMessage(pMsg);
}
virtual BOOL OnIdle()
{
UIUpdateChildWindows();
return FALSE;
}
DWORD StrToHex(LPTSTR Src)
{
DWORD RetVal;
#ifdef USE_STR_TO_ULONG
Src[8] = '\0';
LPTSTR EndData;
RetVal = strtoul(Src, &EndData, 16);
if (EndData == Src)
RetVal = 0xFFFFFFFF;
#else
BYTE HexBuf[8];
int HexSize = 8;
if (FALSE ==AtlHexDecode(Src, 8, HexBuf, &HexSize))
RetVal = 0xFFFFFFFF;
else
{
RetVal = (HexBuf[0] << 8) | HexBuf[1];
RetVal = (RetVal << 8) | HexBuf[2];
RetVal = (RetVal << 8) | HexBuf[3];
}
#endif
return RetVal;
}
int ZCompress(LPBYTE Src, DWORD SrcSize, LPTSTR DestPath)
{
// 弌椡僼傽僀儖偺僆乕僾儞
CAtlFile DestFile;
if (S_OK != DestFile.Create(DestPath, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_DELETE, OPEN_ALWAYS))
{
MessageBox(DestPath, _T("僼傽僀儖偑嶌惉偱偒側偄"), MB_ICONEXCLAMATION);
return Z_STREAM_ERROR;
}
// zlib 弶婜壔
BYTE DestBuf[BUFF_SIZE]; // 弌椡梡僶僢僼傽
z_stream ZStream;
ZStream.next_in = Src;
ZStream.avail_in = SrcSize;
ZStream.next_out = DestBuf;
ZStream.avail_out = BUFF_SIZE;
ZStream.zalloc = Z_NULL;
ZStream.zfree = Z_NULL;
ZStream.opaque = Z_NULL;
int Result = deflateInit(&ZStream, Z_DEFAULT_COMPRESSION); // zlib 弶婜壔
if (Z_OK != Result)
{
MessageBox((ZStream.msg) ? ZStream.msg : _T("晄柧側僄儔乕"), _T("zlib"), MB_ICONEXCLAMATION);
return Result;
}
// 埑弅
int Flush = Z_NO_FLUSH;
while (1)
{
if (ZStream.avail_in < BUFF_SIZE)
Flush = Z_FINISH;
Result = deflate(&ZStream, Flush);
if (Z_STREAM_END == Result) // 姰椆
{
DWORD WriteBytes = BUFF_SIZE - ZStream.avail_out;
if (WriteBytes > 0)
{
if (S_OK != DestFile.Write(DestBuf, WriteBytes))
{
MessageBox(DestPath, _T("僼傽僀儖偵彂偒崬傔側偄"), MB_ICONEXCLAMATION);
Result = Z_STREAM_ERROR;
break;
}
}
break;
}
else if(Z_OK != Result) // 僄儔乕
{
MessageBox((ZStream.msg) ? ZStream.msg : _T("晄柧側僄儔乕"), _T("zlib"), MB_ICONEXCLAMATION);
break;
}
if (! ZStream.avail_out) // 弌椡僶僢僼傽偑堦攖偵側偭偨傜丄彂偒弌偡
{
if (S_OK != DestFile.Write(DestBuf, BUFF_SIZE))
{
MessageBox(DestPath, _T("僼傽僀儖偵彂偒崬傔側偄"), MB_ICONEXCLAMATION);
Result = Z_STREAM_ERROR;
break;
}
ZStream.next_out = DestBuf;
ZStream.avail_out = BUFF_SIZE;
}
}
// 屻張棟
deflateEnd(&ZStream);
return Result;
}
int ZUncompress(LPBYTE Src, DWORD SrcSize, LPTSTR DestPath)
{
// 弌椡僼傽僀儖偺僆乕僾儞
CAtlFile DestFile;
if (S_OK != DestFile.Create(DestPath, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_DELETE, OPEN_ALWAYS))
{
MessageBox(DestPath, _T("僼傽僀儖偑嶌惉偱偒側偄"), MB_ICONEXCLAMATION);
return Z_STREAM_ERROR;
}
// zlib 弶婜壔
BYTE DestBuf[BUFF_SIZE]; // 弌椡梡僶僢僼傽
z_stream ZStream;
ZStream.next_in = Src;
ZStream.avail_in = SrcSize;
ZStream.next_out = DestBuf;
ZStream.avail_out = BUFF_SIZE;
ZStream.zalloc = Z_NULL;
ZStream.zfree = Z_NULL;
int Result = inflateInit(&ZStream); // zlib 弶婜壔
if (Z_OK != Result)
{
MessageBox((ZStream.msg) ? ZStream.msg : _T("晄柧側僄儔乕"), _T("zlib"), MB_ICONEXCLAMATION);
return Result;
}
// 揥奐丂- 弌椡僒僀僘偑傢偐偭偰偄傟偽丄uncompress()偱廫暘
while (1)
{
Result = inflate(&ZStream, Z_NO_FLUSH);
if (Z_STREAM_END == Result) // 姰椆
{
DWORD WriteBytes = BUFF_SIZE - ZStream.avail_out;
if (WriteBytes > 0)
{
if (S_OK != DestFile.Write(DestBuf, WriteBytes))
{
MessageBox(DestPath, _T("僼傽僀儖偵彂偒崬傔側偄"), MB_ICONEXCLAMATION);
Result = Z_STREAM_ERROR;
break;
}
}
break;
}
else if(Z_OK != Result) // 僄儔乕
{
MessageBox((ZStream.msg) ? ZStream.msg : _T("晄柧側僄儔乕"), _T("zlib"), MB_ICONEXCLAMATION);
break;
}
if (! ZStream.avail_out) // 弌椡僶僢僼傽偑堦攖偵側偭偨傜丄彂偒弌偡
{
if (S_OK != DestFile.Write(DestBuf, BUFF_SIZE))
{
MessageBox(DestPath, _T("僼傽僀儖偵彂偒崬傔側偄"), MB_ICONEXCLAMATION);
Result = Z_STREAM_ERROR;
break;
}
ZStream.next_out = DestBuf;
ZStream.avail_out = BUFF_SIZE;
}
}
// 屻張棟
inflateEnd(&ZStream);
return Result;
}
BEGIN_UPDATE_UI_MAP(CMainDlg)
UPDATE_ELEMENT(IDOK, UPDUI_CHILDWINDOW)
UPDATE_ELEMENT(IDC_BTN_COMPRESS, UPDUI_CHILDWINDOW)
END_UPDATE_UI_MAP()
BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_DROPFILES, OnDropFiles)
// COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
COMMAND_ID_HANDLER(IDC_BTN_SRC, OnBnClkSrc)
COMMAND_ID_HANDLER(IDC_BTN_DEST, OnBnClkDest)
COMMAND_CODE_HANDLER(EN_UPDATE, OnEnUpdate)
COMMAND_ID_HANDLER(IDOK, OnOK)
COMMAND_ID_HANDLER(IDC_BTN_COMPRESS, OnOK)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()
// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
/* ------------ 儊僢僙乕僕僴儞僪儔 --------------------------------------------------------------------- */
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// center the dialog on the screen
CenterWindow();
// set icons
HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
SetIcon(hIcon, TRUE);
HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME),
IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
SetIcon(hIconSmall, FALSE);
// register object for message filtering and idle updates
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
UIAddChildWindowContainer(m_hWnd);
// 僐儞僩儘乕儖偺弶婜壔
SetDlgItemText(IDC_EDT_OFFSET, _T("00007EDB"));
UIEnable(IDOK, 0);
UIEnable(IDC_BTN_COMPRESS, 0);
mOkEnable = FALSE;
return TRUE;
}
LRESULT OnDropFiles(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
HDROP hDrop = (HDROP)wParam;
TCHAR SrcPath[MAX_PATH * 2];
// 僪儔僢僌偝傟偨僼傽僀儖傪丄僄僨傿僢僩儃僢僋僗偵僙僢僩
::DragQueryFile(hDrop, 0, SrcPath, MAX_PATH * 2 - 4);
SetDlgItemText(IDC_EDT_SRC, SrcPath);
lstrcat(SrcPath, _T(".log"));
SetDlgItemText(IDC_EDT_DEST, SrcPath);
return 0;
}
/* ------------- 僐儅儞僪僴儞僪儔 ---------------------------------------------------------------------- */
LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
LRESULT OnBnClkSrc(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All Files (*.*)\0*.*\0"), CWindow::m_hWnd);
if (dlg.DoModal() == IDOK)
{
ATLTRACE("Src : title = %s\n", dlg.m_szFileTitle);
ATLTRACE("name = %s\n", dlg.m_szFileName);
// 擖椡僼傽僀儖柤傪僙僢僩
CEdit EditSrc = GetDlgItem(IDC_EDT_SRC);
EditSrc.SetWindowText(dlg.m_szFileName);
// 弌椡僼傽僀儖柤傪僙僢僩
CEdit EditDest = GetDlgItem(IDC_EDT_DEST);
TCHAR DestPath[MAX_PATH * 2];
lstrcpyn(DestPath, dlg.m_szFileName, MAX_PATH * 2 - 4);
lstrcat(DestPath, _T(".log"));
EditDest.SetWindowText(DestPath);
}
return 0;
}
LRESULT OnBnClkDest(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CFileDialog dlg(TRUE, _T("log"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Data Files (*.log)\0*.dat\0All Files (*.*)\0*.*\0"), CWindow::m_hWnd);
if (dlg.DoModal() == IDOK)
{
ATLTRACE("Dest : title = %s\n", dlg.m_szFileTitle);
ATLTRACE("name = %s\n", dlg.m_szFileName);
// 弌椡僼傽僀儖柤傪僙僢僩
CEdit EditDest = GetDlgItem(IDC_EDT_DEST);
EditDest.SetWindowText(dlg.m_szFileName);
}
return 0;
}
LRESULT OnEnUpdate(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
WORD wID2;
if (wID == IDC_EDT_SRC)
wID2 = IDC_EDT_DEST;
else if (wID == IDC_EDT_DEST)
wID2 = IDC_EDT_SRC;
else return 0;
// 僷僗偑桳岠偐偳偆偐
TCHAR FilePath[4];
DWORD PathLen = GetDlgItemText(wID, FilePath, sizeof(TCHAR) * 4);
if (mOkEnable)
{
if (PathLen == 0)
{
mOkEnable = false;
UIEnable(IDOK, 0);
UIEnable(IDC_BTN_COMPRESS, 0);
}
}
else
{
if (PathLen > 0 && GetDlgItemText(wID2, FilePath, sizeof(TCHAR) * 4) > 0)
{
mOkEnable = true;
UIEnable(IDOK, 1);
UIEnable(IDC_BTN_COMPRESS, 1);
}
}
return 0;
}
LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// TODO: Add validation code
//CloseDialog(wID);
// 擖椡僼傽僀儖偺僆乕僾儞
CEdit EditSrc = GetDlgItem(IDC_EDT_SRC);
TCHAR SrcPath[MAX_PATH * 2];
EditSrc.GetWindowText(SrcPath, MAX_PATH * 2);
ATLTRACE("SrcPath = %s\n", SrcPath);
CAtlFile SrcFile;
if (S_OK != SrcFile.Create(SrcPath, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING))
{
MessageBox(SrcPath, _T("僼傽僀儖偑奐偗側偄"), MB_ICONEXCLAMATION);
return 0;
}
ULONGLONG UlSrcSize;
SrcFile.GetSize(UlSrcSize);
if (UlSrcSize >> 32)
{
MessageBox(SrcPath, _T("僼傽僀儖僒僀僘偑戝偒夁偓傞"), MB_ICONEXCLAMATION);
return 0;
}
DWORD SrcSize = (DWORD)UlSrcSize;
ATLTRACE("SrcSize = %ld\n", SrcSize);
// 僆僼僙僢僩抣偺撉傒崬傒
int Result;
DWORD Offset = 0;
if (wID == IDOK)
{
TCHAR HexData[16];
int Result = GetDlgItemText(IDC_EDT_OFFSET, HexData, sizeof(TCHAR) * 16);
Offset = StrToHex(HexData);
if (Result > sizeof(TCHAR) * 8 || Offset > SrcSize)
{
MessageBox(_T("僆僼僙僢僩抣偑晄惓"), _T("僄儔乕"), MB_ICONEXCLAMATION);
return 0;
}
}
// 擖椡僼傽僀儖偺撉傒崬傒
HANDLE hf = (HANDLE)SrcFile;
CAtlFileMapping<BYTE> SrcMap;
if (S_OK != SrcMap.MapFile(hf))
{
MessageBox(SrcPath, _T("僼傽僀儖偑撉傒崬傔側偄"), MB_ICONEXCLAMATION);
return 0;
}
LPBYTE Src = static_cast<LPBYTE>(SrcMap) + Offset;
// 揥奐 or 埑弅
CEdit EditDest = GetDlgItem(IDC_EDT_DEST);
TCHAR DestPath[MAX_PATH * 2];
EditDest.GetWindowText(DestPath, MAX_PATH * 2);
ATLTRACE("DestPath = %s\n", DestPath);
if (wID == IDOK)
{
// zlib 僿僢僟乕偺僠僃僢僋
int ZlibHeader = (Src[0] << 8) | Src[1];
ATLTRACE("Header = %d (0x%04x)\n", ZlibHeader, ZlibHeader);
if (ZlibHeader % 31)
{
MessageBox(SrcPath, _T("zlib : Incorrect header"), MB_ICONEXCLAMATION);
return 0;
}
Result = ZUncompress(Src, SrcSize, DestPath);
}
else if (wID == IDC_BTN_COMPRESS)
Result = ZCompress(Src, SrcSize, DestPath);
// 屻張棟
if (Z_STREAM_END == Result)
MessageBox(_T("姰椆偟傑偟偨"), _T(""), MB_OK);
else
Result = ::DeleteFile(DestPath); // 幐攕側傜丄弌椡僼傽僀儖嶍彍
return 0;
}
LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CloseDialog(wID);
return 0;
}
void CloseDialog(int nVal)
{
DestroyWindow();
::PostQuitMessage(nVal);
}
};
#endif // UNZLIB_ABOUT_DLG_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -