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

📄 mainfrm.h

📁 是WTL的开发包,直接包括在路径中,最好放在VC目录中,要更新的包请到官方网站去下载
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -