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 + -
显示快捷键?