📄 mainfrm.h
字号:
break;
}
}
// open file
if(DoFileOpen(szFile, lpstrFileName))
m_mru.MoveToTop(wID);
else
m_mru.RemoveFromList(wID);
m_mru.WriteToRegistry(lpcstrMTPadRegKey);
}
else
{
::MessageBeep(MB_ICONERROR);
}
return 0;
}
LRESULT OnFileNewWindow(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
::PostThreadMessage(_Module.m_dwMainThreadID, WM_USER, 0, 0L);
return 0;
}
LRESULT OnFileExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
PostMessage(WM_CLOSE);
return 0;
}
LRESULT OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
static BOOL bNew = TRUE; // initially visible
bNew = !bNew;
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 1, bNew); // toolbar is band #1
UISetCheck(ID_VIEW_TOOLBAR, bNew);
UpdateLayout();
return 0;
}
LRESULT OnViewStatusBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
BOOL bNew = !::IsWindowVisible(m_hWndStatusBar);
::ShowWindow(m_hWndStatusBar, bNew ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_STATUS_BAR, bNew);
UpdateLayout();
return 0;
}
LRESULT OnAppAbout(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if((HWND)wParam == m_view.m_hWnd)
{
CMenu menuContext;
menuContext.LoadMenu(IDR_CONTEXTMENU);
CMenuHandle menuPopup(menuContext.GetSubMenu(0));
m_CmdBar.TrackPopupMenu(menuPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, LOWORD(lParam), HIWORD(lParam));
}
else
bHandled = FALSE;
return 0;
}
void UpdateUIAll()
{
BOOL bModified = m_view.GetModify();
if(bModified != m_bModified)
{
m_bModified = bModified;
UpdateTitle();
}
UIEnable(ID_EDIT_UNDO, m_view.CanUndo());
UIEnable(ID_EDIT_PASTE, m_view.CanPaste(CF_TEXT));
BOOL bSel = (m_view.GetSelectionType() != SEL_EMPTY);
UIEnable(ID_EDIT_CUT, bSel);
UIEnable(ID_EDIT_COPY, bSel);
UIEnable(ID_EDIT_CLEAR, bSel);
BOOL bNotEmpty = (m_view.GetWindowTextLength() > 0);
UIEnable(ID_EDIT_SELECT_ALL, bNotEmpty);
UIEnable(ID_EDIT_FIND, bNotEmpty);
UIEnable(ID_EDIT_REPEAT, bNotEmpty);
UIEnable(ID_EDIT_REPLACE, bNotEmpty);
UISetCheck(ID_EDIT_WORD_WRAP, m_view.m_bWordWrap);
if(prev.IsWindow() && (prev.GetStyle() & WS_VISIBLE) != 0)
{
UIEnable(ID_PP_BACK, (prev.m_nCurPage > prev.m_nMinPage));
UIEnable(ID_PP_FORWARD, prev.m_nCurPage < prev.m_nMaxPage);
}
UIUpdateToolBar();
}
//print job info callback
virtual bool IsValidPage(UINT /*nPage*/)
{
return true;
}
virtual bool PrintPage(UINT nPage, HDC hDC)
{
if (nPage >= (UINT)m_arrPages.GetSize())
return false;
RECT rcPage;
rcPage.left = rcPage.top = 0;
rcPage.bottom = GetDeviceCaps(hDC, PHYSICALHEIGHT);
rcPage.right = GetDeviceCaps(hDC, PHYSICALWIDTH);
rcPage.right = MulDiv(rcPage.right, 1440, GetDeviceCaps(hDC, LOGPIXELSX));
rcPage.bottom = MulDiv(rcPage.bottom, 1440, GetDeviceCaps(hDC, LOGPIXELSY));
RECT rcOutput = rcPage;
//convert from 1/1000" to twips
rcOutput.left += MulDiv(m_rcMargin.left, 1440, 1000);
rcOutput.right -= MulDiv(m_rcMargin.right, 1440, 1000);
rcOutput.top += MulDiv(m_rcMargin.top, 1440, 1000);
rcOutput.bottom -= MulDiv(m_rcMargin.bottom, 1440, 1000);
FORMATRANGE fr;
fr.hdc = hDC;
fr.hdcTarget = hDC;
fr.rc = rcOutput;
fr.rcPage = rcPage;
fr.chrg.cpMin = 0;
fr.chrg.cpMax = -1;
fr.chrg.cpMin = m_arrPages[nPage];
// We have to adjust the origin because 0,0 is not at the corner of the paper
// but is at the corner of the printable region
int nOffsetX = GetDeviceCaps(hDC, PHYSICALOFFSETX);
int nOffsetY = GetDeviceCaps(hDC, PHYSICALOFFSETY);
SetViewportOrgEx(hDC, -nOffsetX, -nOffsetY, NULL);
m_view.FormatRange(fr, TRUE);
m_view.DisplayBand(&rcOutput);
//Cleanup cache in richedit
m_view.FormatRange(NULL, FALSE);
return true;
}
bool LayoutPages()
{
CDC dc = printer.CreatePrinterDC(devmode);
if(dc.IsNull())
return false;
RECT rcPage;
rcPage.left = rcPage.top = 0;
rcPage.bottom = GetDeviceCaps(dc, PHYSICALHEIGHT);
rcPage.right = GetDeviceCaps(dc, PHYSICALWIDTH);
// We have to adjust the origin because 0,0 is not at the corner of the paper
// but is at the corner of the printable region
int nOffsetX = dc.GetDeviceCaps(PHYSICALOFFSETX);
int nOffsetY = dc.GetDeviceCaps(PHYSICALOFFSETY);
dc.SetViewportOrg(-nOffsetX, -nOffsetY);
rcPage.right = MulDiv(rcPage.right, 1440, GetDeviceCaps(dc, LOGPIXELSX));
rcPage.bottom = MulDiv(rcPage.bottom, 1440, GetDeviceCaps(dc, LOGPIXELSY));
RECT rcOutput = rcPage;
//convert from 1/1000" to twips
rcOutput.left += MulDiv(m_rcMargin.left, 1440, 1000);
rcOutput.right -= MulDiv(m_rcMargin.right, 1440, 1000);
rcOutput.top += MulDiv(m_rcMargin.top, 1440, 1000);
rcOutput.bottom -= MulDiv(m_rcMargin.bottom, 1440, 1000);
FORMATRANGE fr;
fr.hdc = dc;
fr.hdcTarget = dc;
fr.rc = rcOutput;
fr.rcPage = rcPage;
fr.chrg.cpMin = 0;
fr.chrg.cpMax = -1;
LONG n = (LONG)m_view.GetTextLength();
m_arrPages.RemoveAll();
while (1)
{
m_arrPages.Add(fr.chrg.cpMin);
LONG lRet = m_view.FormatRange(fr, FALSE);
if((lRet - fr.chrg.cpMin) == -1)
{
m_arrPages.RemoveAt(m_arrPages.GetSize()-1);
break;
}
else
fr.chrg.cpMin = lRet;
if (fr.chrg.cpMin >= n)
break;
}
m_view.FormatRange(NULL, FALSE);
return true;
}
LRESULT OnFilePrint(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if(!LayoutPages())
{
MessageBox(_T("Print operation failed"), _T("MTPad"), MB_ICONERROR | MB_OK);
return 0;
}
CPrintDialog dlg(FALSE);
dlg.m_pd.hDevMode = devmode.CopyToHDEVMODE();
dlg.m_pd.hDevNames = printer.CopyToHDEVNAMES();
dlg.m_pd.nMinPage = 1;
dlg.m_pd.nMaxPage = (WORD)m_arrPages.GetSize();
dlg.m_pd.nFromPage = 1;
dlg.m_pd.nToPage = (WORD)m_arrPages.GetSize();
dlg.m_pd.Flags &= ~PD_NOPAGENUMS;
if (dlg.DoModal() == IDOK)
{
devmode.CopyFromHDEVMODE(dlg.m_pd.hDevMode);
printer.ClosePrinter();
printer.OpenPrinter(dlg.m_pd.hDevNames, devmode.m_pDevMode);
CPrintJob job;
int nMin=0;
int nMax = m_arrPages.GetSize()-1;
if (dlg.m_pd.Flags | PD_PAGENUMS)
{
nMin = dlg.m_pd.nFromPage-1;
nMax = dlg.m_pd.nToPage-1;
}
job.StartPrintJob(false, printer, devmode.m_pDevMode, this, _T("MTPad Document"), nMin, nMax);
}
GlobalFree(dlg.m_pd.hDevMode);
GlobalFree(dlg.m_pd.hDevNames);
return 0;
}
LRESULT OnFilePrintPreview(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
bool bRet = LayoutPages();
if(!bRet)
{
MessageBox(_T("Print preview operation failed"), _T("MTPad"), MB_ICONERROR | MB_OK);
return 0;
}
prev.SetPrintPreviewInfo(printer, devmode.m_pDevMode, this, 0, m_arrPages.GetSize() - 1);
prev.SetPage(0);
RECT rcPos;
GetClientRect(&rcPos);
prev.Create(m_hWnd, rcPos);
prev.ShowWindow(SW_SHOW);
prev.SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
::ShowWindow(m_hWndClient, SW_HIDE);
m_hWndOldClient = m_hWndClient;
m_hWndClient = prev;
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 1, FALSE); // toolbar is band #1
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 2, TRUE); // print preview toolbar is band #2
UpdateLayout();
return 0;
}
LRESULT OnFilePageSetup(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CPageSetupDialog dlg;
dlg.m_psd.hDevMode = devmode.CopyToHDEVMODE();
dlg.m_psd.hDevNames = printer.CopyToHDEVNAMES();
dlg.m_psd.rtMargin = m_rcMargin;
if (dlg.DoModal() == IDOK)
{
devmode.CopyFromHDEVMODE(dlg.m_psd.hDevMode);
printer.ClosePrinter();
printer.OpenPrinter(dlg.m_psd.hDevNames, devmode.m_pDevMode);
m_rcMargin = dlg.m_psd.rtMargin;
}
GlobalFree(dlg.m_psd.hDevMode);
GlobalFree(dlg.m_psd.hDevNames);
return 0;
}
LRESULT OnPrintPreviewClose(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
prev.DestroyWindow();
m_hWndClient = m_hWndOldClient;
::ShowWindow(m_hWndClient, SW_SHOW);
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 1, TRUE); // toolbar is band #1
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 2, FALSE); // print preview toolbar is band #2
UpdateLayout();
return 0;
}
LRESULT OnPrintPreviewForward(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
prev.NextPage();
return 0;
}
LRESULT OnPrintPreviewBack(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
prev.PrevPage();
return 0;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -