mainfrm.h

来自「WTL开发的一个写字板程序 ,很有借鉴意义」· C头文件 代码 · 共 1,316 行 · 第 1/3 页

H
1,316
字号
/*
 Copyright (c) 2000 
 Author: Konstantin Boukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 07.07.2000 18:11:08
 Version: 1.0.0

 MainFrm.h : interface of the CMainFrame class
 
 based on MTPad sample from MS SDK 12/01/99
*/

#if !defined(AFX_MAINFRM_H__44FA1498_FAD8_47D3_B3DB_6E5CA86E2C2B__INCLUDED_)
#define AFX_MAINFRM_H__44FA1498_FAD8_47D3_B3DB_6E5CA86E2C2B__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

namespace {

// filter string
const TCHAR* sFilter = 
			_T("All Files (*.*)\0*.*\0")
			_T("Text Files (*.txt)\0*.txt\0")
			_T("RTF Files (*.rtf)\0*.rtf\0");
}

class CMainFrame : 
	public CFrameWindowImpl<CMainFrame>, 
	public CUpdateUI<CMainFrame>,
	public CMessageFilter, 
	public CIdleHandler,
	public IMainFrame,
	public CPrintJobInfo
{	
	enum {
		FILE_MENU_POSITION = 0,
		RECENT_MENU_POSITION = 14,
		ID_FORMAT_TOOLBAR = 101,
		ID_PRINT_TOOLBAR,
		IDC_FONTNAME,
		IDC_FONTSIZE,
		IDC_SHEETS
	};
		
//	CCommandBarCtrl m_CmdBar;
	RamonSmit_CCommandBarCtrl m_CmdBar;
	CRecentDocumentList m_mru;
	CMultiPaneStatusBarCtrl m_sbar;
	CProgressBarCtrl m_progress;	
	kFontCombo m_comboFont;
	kFlatCombo m_comboSize;
	kSheetsCtrl m_view;
	
	bool m_bModified;

	DWORD m_bShowToolBar;
	DWORD m_bShowFormatBar;
	DWORD m_bShowStatusBar;

	kOption m_defOption;

	DWORD m_dwTimeRefreshStatusBar;

//// print
	CPrinterT<true> printer;
	CDevModeT<true> devmode;
	CPrintPreviewWindow prev;
	RECT m_rcMargin;
	HWND m_hWndToolBarPP;
	CSimpleValArray<long> m_arrPages;

public:
	CMainFrame() 
	{		
		m_bModified = false;

		m_bShowToolBar = TRUE;
		m_bShowFormatBar = TRUE;
		m_bShowStatusBar = TRUE;

		m_dwTimeRefreshStatusBar = 0;

		// print
		m_rcMargin.left = m_rcMargin.right = m_rcMargin.top = m_rcMargin.bottom = 1000;		
		m_hWndToolBarPP = 0;
		printer.OpenDefaultPrinter();
		devmode.CopyFromPrinter(printer);
	}

	DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)

	BEGIN_MSG_MAP(CMainFrame)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
		MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
		MESSAGE_HANDLER(WM_INPUTLANGCHANGE, OnRefreshKeyboardLayout)
		MESSAGE_HANDLER(WM_CLOSE, OnClose)
				
		//
		if (uMsg == WM_COMMAND) {
			if (m_view.ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0))
				return TRUE;
		}

		if (((uMsg == WM_COMMAND) || 
			(uMsg == WM_NOTIFY && (((LPNMHDR)lParam)->idFrom == ID_FORMAT_TOOLBAR) && (((LPNMHDR)lParam)->code == TBN_DROPDOWN)))
			&& !m_view.IsEmpty())
		{ 
			kSheetView* sheet = m_view.GetAt(m_view.Active());			
			if (sheet->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0))			
				return TRUE;			
		}
		//

		COMMAND_ID_HANDLER(ID_FILE_PRINT, OnFilePrint)
		COMMAND_ID_HANDLER(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
		COMMAND_ID_HANDLER(ID_FILE_PRINT_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_APP_EXIT, OnFileExit)
		COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)		
		COMMAND_ID_HANDLER(ID_FILE_NEW_WINDOW, OnFileNewWindow)
		COMMAND_ID_HANDLER(ID_FILE_OPEN, OnFileOpen)
		COMMAND_ID_HANDLER(ID_FILE_SAVE, OnFileSave)
		COMMAND_ID_HANDLER(ID_FILE_SAVE_AS, OnFileSave)
		COMMAND_ID_HANDLER(ID_FILE_CLOSE, OnFileClose)	
		COMMAND_ID_HANDLER(ID_VIEW_TOOLBAR, OnViewToolBar)
		COMMAND_ID_HANDLER(ID_VIEW_FORMAT, OnViewFormat)
		COMMAND_ID_HANDLER(ID_VIEW_STATUS_BAR, OnViewStatusBar)
		COMMAND_ID_HANDLER(ID_OPTION, OnOption)				
		COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)		
		COMMAND_HANDLER(IDC_FONTNAME, CBN_SELCHANGE, OnSelectFontName) 
		COMMAND_HANDLER(IDC_FONTSIZE, CBN_SELCHANGE, OnSelectFontSize)		
		COMMAND_RANGE_HANDLER(ID_FILE_MRU_FIRST, ID_FILE_MRU_LAST, OnFileRecent)
		
		NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnToolbarDropDown)
		NOTIFY_HANDLER(IDC_SHEETS, kSheetsCtrl::SC_ONCHANGESHEET, OnChangeSheet)
		
		CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
		CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)

		REFLECT_NOTIFICATIONS()		
	END_MSG_MAP()

	BEGIN_UPDATE_UI_MAP(CMainFrame)
		UPDATE_ELEMENT(ID_FILE_SAVE,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FILE_SAVE_AS,		UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_CLOSE,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FILE_PRINT,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FILE_PRINT_PREVIEW,	UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FILE_PRINT_SETUP,	UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_REDO,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		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)
		UPDATE_ELEMENT(ID_EDIT_FIND,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_EDIT_REPEAT,		UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_EDIT_REPLACE,		UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_FORMAT_FONT,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_COLOR,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_BGRN,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_HIGHLIGHT,	UPDUI_MENUPOPUP | UPDUI_TOOLBAR)		
		UPDATE_ELEMENT(ID_FORMAT_BOLD,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_ITALIC,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_UNDERLINE,	UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_CNT,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_LEFT,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_RIGHT,		UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_FORMAT_JST,			UPDUI_MENUPOPUP | UPDUI_TOOLBAR)
		UPDATE_ELEMENT(ID_EDIT_WORD_WRAP,	UPDUI_MENUPOPUP)		
		UPDATE_ELEMENT(ID_VIEW_TOOLBAR,		UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_FORMAT,		UPDUI_MENUPOPUP)
		UPDATE_ELEMENT(ID_VIEW_STATUS_BAR,	UPDUI_MENUPOPUP)
	END_UPDATE_UI_MAP()

	virtual BOOL PreTranslateMessage(MSG* pMsg)
	{	
		if (m_view.PreTranslateMessage(pMsg))
			return TRUE;

		if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))
			return TRUE;

		return FALSE;
	}

	virtual BOOL OnIdle()
	{
		UpdateUIAll();
		return FALSE;
	}

	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{

		ReadFromRegistry();

		// 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);
		m_CmdBar.LoadImages(IDR_FORMAT);
		// remove old menu
		SetMenu(NULL);

		HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);	
		HWND hWndToolBarFormat = CreateFormatToolbar();

		CreateSimpleReBar(ATL_SIMPLE_REBAR_NOBORDER_STYLE);
		AddSimpleReBarBand(hWndCmdBar);
		AddSimpleReBarBand(hWndToolBar, NULL, TRUE);
		AddSimpleReBarBand(hWndToolBarFormat, NULL, FALSE);

		CreateSimpleStatusBar();
		m_sbar.SubclassWindow(m_hWndStatusBar);
		int arrParts[] =
		{
			ID_DEFAULT_PANE,
			ID_LANG_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_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE,
			IDC_SHEETS);

		UIAddToolBar(hWndToolBar);
		UIAddToolBar(hWndToolBarFormat); 

		UISetCheck(ID_VIEW_TOOLBAR, m_bShowToolBar);
		UISetCheck(ID_VIEW_FORMAT,	 m_bShowFormatBar);
		UISetCheck(ID_VIEW_STATUS_BAR, m_bShowStatusBar);

		CMessageLoop* pLoop = _Module.GetMessageLoop();
		pLoop->AddMessageFilter(this);
		pLoop->AddIdleHandler(this);

		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(kPadRegKey);
		
	//set drop down style
		CToolBarCtrl m_tbar(hWndToolBar);
		CToolBarCtrl m_fbar(hWndToolBarFormat);
		
		m_tbar.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); // | TBSTYLE_EX_HIDECLIPPEDBUTTONS
		m_fbar.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); 

		TBBUTTONINFO tbi;
		tbi.cbSize = sizeof TBBUTTONINFO;
		tbi.dwMask = TBIF_STYLE;
		tbi.fsStyle = TBSTYLE_DROPDOWN;
		
		m_tbar.SetButtonInfo(ID_FILE_OPEN, &tbi);
		m_fbar.SetButtonInfo(ID_FORMAT_COLOR, &tbi);
		m_fbar.SetButtonInfo(ID_FORMAT_BGRN, &tbi);
		m_fbar.SetButtonInfo(ID_FORMAT_HIGHLIGHT, &tbi);

		::SendMessage(m_hWndToolBar, RB_SHOWBAND, 1, m_bShowToolBar);	// toolbar is band #1
		::SendMessage(m_hWndToolBar, RB_SHOWBAND, 2, m_bShowFormatBar);	// toolbar is band #2
		::ShowWindow(m_hWndStatusBar, m_bShowStatusBar ? SW_SHOWNOACTIVATE : SW_HIDE);

		CRegKey key;			
		if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, kPadRegKey))
		{
			RestoreBandInfo(key);
			m_defOption.Load(key);
		}
		
		Send_RefreshStatusBar(_T("Ready"));		
		return 0;
	}

	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		if (m_hWndToolBarPP)
			RemovePrintBand();

		CRegKey key;			
		if (ERROR_SUCCESS == key.Create(HKEY_CURRENT_USER, kPadRegKey))
		{
			if (!IsIconic())
			{
				RECT rc;
				GetWindowRect(&rc);
				RegSetValueEx(key, _T("WindowRect"), 0, REG_BINARY, (CONST BYTE *)&rc, sizeof RECT);	
			}

			key.SetValue(m_bShowToolBar,   _T("ToolBar"));
			key.SetValue(m_bShowFormatBar, _T("FormatBar"));
			key.SetValue(m_bShowStatusBar, _T("StatusBar"));
			
			SaveBandsInfo(key);
			m_defOption.Save(key);
		}

		m_mru.WriteToRegistry(kPadRegKey);
		bHandled = FALSE;		
		return 0;
	}

	LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		bHandled = FALSE;

		for (unsigned int i = 0; i < m_view.Count(); i++)
		{			
			if (IDCANCEL == QuerySave(m_view.GetAt(i))) {
				Send_RefreshStatusBar(_T("Ok. Cancel exit"));
				bHandled = TRUE;
				break;
			}
		}
		return 0;
	}
	
	LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		BOOL b;
		OnRefreshKeyboardLayout(0, 0, 0, b);

		if(!m_view.IsEmpty()) {
			kSheetView* sheet =  m_view.GetAt(m_view.Active());		
			sheet->SetFocus(); 
		}
		return 0;
	}
	
	LRESULT OnFileExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		PostMessage(WM_CLOSE);
		return 0;
	}

	LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		kSheetView* sheet = m_view.Add();		
		sheet->InitNew(); 
		sheet->SetOption(m_defOption);
		sheet->SetModify(FALSE);
		m_view.Active(m_view.Count() - 1);

		Send_RefreshStatusBar(_T("Ok. Created new file %s"), sheet->Name());
		return 0;
	}

	LRESULT OnFileNewWindow(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		::PostThreadMessage(_Module.m_dwMainThreadID, WM_USER, 0, 0L);
		Send_RefreshStatusBar(_T("Ok. Created new window"));
		return 0;
	}

	LRESULT OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CFileDialog dlg(TRUE, 0, _T(""), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, sFilter);
		int r = dlg.DoModal();

		if (r == IDOK)
		{
			DoFileOpen(dlg.m_ofn.lpstrFile);				
		}				
		return 0;
	}	

	LRESULT OnFileRecent(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{			
		TCHAR sFile[MAX_PATH];
		if(m_mru.GetFromList(wID, sFile))
		{										
			if(DoFileOpen(sFile, false))
				m_mru.MoveToTop(wID);
			else
				m_mru.RemoveFromList(wID);													
		}
		else
		{
			::MessageBeep(MB_ICONERROR);
			Send_RefreshStatusBar(_T("Error. Cannot get file name from mru list"));
		}
		return 0;
	}

	LRESULT OnFileSave(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		ATLASSERT(!m_view.IsEmpty());

		kSheetView* sheet =  m_view.GetAt(m_view.Active());
				
		if ((ID_FILE_SAVE == wID) && lstrlen(sheet->Path())) 
		{
			DoFileSave(sheet, 0);
			return 0;
		}		
		
		
		CFileDialog dlg(FALSE, 0, sheet->Name(), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER, sFilter);
		dlg.m_ofn.nFilterIndex = 3; //.rtf
		int r = dlg.DoModal();
		if (r != IDOK)
			return 0;			
			
		if (dlg.m_ofn.nFilterIndex != 1) //*.*				
		{
			const TCHAR* p = kSheetView::RFind(dlg.m_ofn.lpstrFile, _T("\\.")); //fix
			if ((p == 0) || (*p == _T('\\'))) 
			{
				if (dlg.m_ofn.nFilterIndex == 2)
					lstrcat(dlg.m_ofn.lpstrFile, _T(".txt"));
				else if (dlg.m_ofn.nFilterIndex == 3)
					lstrcat(dlg.m_ofn.lpstrFile, _T(".rtf"));
			} 								
		}

		bool bUpdateTitle = lstrcmp(dlg.m_ofn.lpstrFile, sheet->Path()) != 0;

		if (DoFileSave(sheet, dlg.m_ofn.lpstrFile) && bUpdateTitle)
		{
			UpdateTitle();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?