📄 mainfrm.h
字号:
#define FILE_MENU_POSITION 0
#define RECENT_MENU_POSITION 11
class CMainFrame :
public CFrameWindowImpl<CMainFrame>,
public CUpdateUI<CMainFrame>,
public CPrintJobInfo
{
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME);
CCommandBarCtrl m_CmdBar;
CMultiPaneStatusBarCtrl m_sbar;
CRecentDocumentList m_mru;
CEditView m_view;
BOOL m_bModified;
CPrinterT<true> printer;
CDevModeT<true> devmode;
CPrintPreviewWindow prev;
CEnhMetaFileT<true> enhmetafile;
CRect m_rcMargin;
HWND m_hWndOldClient;
HWND m_hWndToolBarPP;
CSimpleValArray<long> m_arrPages;
CMainFrame() : m_bModified(FALSE), m_rcMargin(1000, 1000, 1000, 1000)
{
printer.OpenDefaultPrinter();
devmode.CopyFromPrinter(printer);
}
BOOL PreTranslateMessage(MSG* pMsg)
{
if(m_view.m_pFindDlg != NULL)
{
_ASSERTE(::IsWindow(m_view.m_pFindDlg->m_hWnd));
if(::IsDialogMessage(m_view.m_pFindDlg->m_hWnd, pMsg))
return TRUE;
}
return CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg);
}
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_UPDATEROWCOL, OnUpdateRowCol)
COMMAND_ID_HANDLER(ID_FILE_PRINT, OnFilePrint)
COMMAND_ID_HANDLER(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
COMMAND_ID_HANDLER(ID_FILE_PAGE_SETUP, OnFilePageSetup)
COMMAND_ID_HANDLER(ID_PP_CLOSE, OnPrintPreviewClose)
COMMAND_ID_HANDLER(ID_PP_BACK, OnPrintPreviewBack)
COMMAND_ID_HANDLER(ID_PP_FORWARD, OnPrintPreviewForward)
COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
COMMAND_ID_HANDLER(ID_FILE_OPEN, OnFileOpen)
COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileSave)
COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileSaveAs)
COMMAND_RANGE_HANDLER(ID_FILE_MRU_FIRST, ID_FILE_MRU_LAST, OnFileRecent)
COMMAND_ID_HANDLER(ID_FILE_NEW_WINDOW, OnFileNewWindow)
COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_COMMANDS_ALT_MEMBER((m_view), 1)
END_MSG_MAP()
BEGIN_UPDATE_UI_MAP(CMainFrame)
UPDATE_ELEMENT(ID_EDIT_UNDO, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_CUT, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_COPY, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_PASTE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_CLEAR, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_SELECT_ALL, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_FIND, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_REPEAT, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_REPLACE, UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_EDIT_WORD_WRAP, UPDUI_MENUPOPUP)
UPDATE_ELEMENT(ID_VIEW_TOOLBAR, UPDUI_MENUPOPUP)
UPDATE_ELEMENT(ID_VIEW_STATUS_BAR, UPDUI_MENUPOPUP)
UPDATE_ELEMENT(ID_PP_BACK, UPDUI_TOOLBAR)
UPDATE_ELEMENT(ID_PP_FORWARD, UPDUI_TOOLBAR)
END_UPDATE_UI_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// create command bar window
HWND hWndCmdBar = m_CmdBar.Create(m_hWnd, rcDefault, NULL, ATL_SIMPLE_CMDBAR_PANE_STYLE);
// atach menu
m_CmdBar.AttachMenu(GetMenu());
// load command bar images
m_CmdBar.LoadImages(IDR_MAINFRAME);
// remove old menu
SetMenu(NULL);
HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
AddSimpleReBarBand(hWndCmdBar);
AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
CreateSimpleStatusBar();
m_sbar.SubclassWindow(m_hWndStatusBar);
int arrParts[] =
{
ID_DEFAULT_PANE,
ID_ROW_PANE,
ID_COL_PANE
};
m_sbar.SetPanes(arrParts, sizeof(arrParts) / sizeof(int), false);
m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE |
ES_NOHIDESEL | ES_SAVESEL | ES_SELECTIONBAR,
WS_EX_CLIENTEDGE);
UIAddToolBar(hWndToolBar);
UISetCheck(ID_VIEW_TOOLBAR, 1);
UISetCheck(ID_VIEW_STATUS_BAR, 1);
SendMessage(WM_UPDATEROWCOL); // update row and col indicators
m_hWndToolBarPP = CreateSimpleToolBarCtrl(m_hWnd, IDR_PRINTPREVIEWBAR, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE, ATL_IDW_TOOLBAR + 1);
AddSimpleReBarBand(m_hWndToolBarPP, NULL, TRUE);
::SendMessage(m_hWndToolBar, RB_SHOWBAND, 2, FALSE); // print preview toolbar is band #2
UIAddToolBar(m_hWndToolBarPP);
HMENU hMenu = m_CmdBar.GetMenu();
HMENU hFileMenu = ::GetSubMenu(hMenu, FILE_MENU_POSITION);
#ifdef _DEBUG
// absolute position, can change if menu changes
TCHAR szMenuString[100];
::GetMenuString(hFileMenu, RECENT_MENU_POSITION, szMenuString, sizeof(szMenuString), MF_BYPOSITION);
ATLASSERT(lstrcmp(szMenuString, _T("Recent &Files")) == 0);
#endif //_DEBUG
HMENU hMruMenu = ::GetSubMenu(hFileMenu, RECENT_MENU_POSITION);
m_mru.SetMenuHandle(hMruMenu);
m_mru.ReadFromRegistry(lpcstrMTPadRegKey);
return 0;
}
LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = !m_view.QueryClose();
return 0;
}
LRESULT OnUpdateRowCol(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
TCHAR szBuff[100];
wsprintf(szBuff, _T("Row: %i"), m_view.m_nRow + 1);
m_sbar.SetPaneText(ID_ROW_PANE, szBuff);
wsprintf(szBuff, _T("Col: %i"), m_view.m_nCol + 1);
m_sbar.SetPaneText(ID_COL_PANE, szBuff);
return 0;
}
LRESULT UpdateTitle()
{
int nAppendLen = lstrlen(m_view.m_strFileName);
TCHAR strTitleBase[256];
::LoadString(_Module.GetResourceInstance(), IDR_MAINFRAME, strTitleBase, 255);
int nBaseLen = lstrlen(strTitleBase);
// 1 == "*" (optional), 3 == " - ", 1 == null termination
LPTSTR lpstrFullTitle = (LPTSTR)_alloca(nAppendLen + nBaseLen + (1 + 3 + 1) * sizeof(TCHAR));
lstrcpy(lpstrFullTitle, m_view.m_strFileName);
if(m_bModified)
lstrcat(lpstrFullTitle, _T("*"));
lstrcat(lpstrFullTitle, _T(" - "));
lstrcat(lpstrFullTitle, strTitleBase);
SetWindowText(lpstrFullTitle);
return 0;
}
LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
DoFileNew();
return 0;
}
void DoFileNew()
{
if(m_view.QueryClose())
{
m_view.SetWindowText(NULL);
m_view.Init(_T(""), _T("Untitled"));
UpdateTitle();
}
}
LRESULT OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CFileDialog dlg(TRUE, NULL, _T(""), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpcstrFilter);
int nRet = dlg.DoModal();
if(nRet == IDOK)
{
ATLTRACE(_T("File path: %s\n"), dlg.m_ofn.lpstrFile);
BOOL bRet = m_view.QueryClose();
if(!bRet)
{
if(!DoFileSaveAs())
return 0;
}
if(DoFileOpen(dlg.m_ofn.lpstrFile, dlg.m_ofn.lpstrFileTitle))
{
m_mru.AddToList(dlg.m_ofn.lpstrFile);
m_mru.WriteToRegistry(lpcstrMTPadRegKey);
}
}
return 0;
}
BOOL DoFileOpen(LPCTSTR lpstrFileName, LPCTSTR lpstrFileTitle)
{
BOOL bRet = m_view.LoadFile(lpstrFileName);
if(bRet)
{
m_view.Init(lpstrFileName, lpstrFileTitle);
UpdateTitle();
}
else
MessageBox(_T("Error reading file!\n"));
return bRet;
}
LRESULT OnFileSave(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if(m_view.m_strFilePath[0] != 0)
{
if(m_view.SaveFile(m_view.m_strFilePath))
{
m_view.SetModify(FALSE);
m_mru.AddToList(m_view.m_strFilePath);
m_mru.WriteToRegistry(lpcstrMTPadRegKey);
}
else
{
MessageBox(_T("Error writing file!\n"));
}
}
else
{
if(m_view.DoFileSaveAs())
{
UpdateTitle();
m_mru.AddToList(m_view.m_strFilePath);
m_mru.WriteToRegistry(lpcstrMTPadRegKey);
}
}
return 0;
}
LRESULT OnFileSaveAs(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
if(m_view.DoFileSaveAs())
{
UpdateTitle();
m_mru.AddToList(m_view.m_strFilePath);
m_mru.WriteToRegistry(lpcstrMTPadRegKey);
}
return 0;
}
BOOL DoFileSaveAs()
{
BOOL bRet = FALSE;
CFileDialog dlg(FALSE);
int nRet = dlg.DoModal();
if(nRet == IDOK)
{
ATLTRACE(_T("File path: %s\n"), dlg.m_ofn.lpstrFile);
bRet = m_view.SaveFile(dlg.m_ofn.lpstrFile);
if(bRet)
{
m_view.Init(dlg.m_ofn.lpstrFile, dlg.m_ofn.lpstrFileTitle);
UpdateTitle();
}
else
MessageBox(_T("Error writing file!\n"));
}
return bRet;
}
LRESULT OnFileRecent(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// check if we have to save the current one
if(!m_view.QueryClose())
{
if(!m_view.DoFileSaveAs())
return 0;
}
// get file name from the MRU list
TCHAR szFile[MAX_PATH];
if(m_mru.GetFromList(wID, szFile))
{
// find file name without the path
LPTSTR lpstrFileName = szFile;
for(int i = lstrlen(szFile) - 1; i >= 0; i--)
{
if(szFile[i] == '\\')
{
lpstrFileName = &szFile[i + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -