mainfrm.h
来自「WTL开发的一个写字板程序 ,很有借鉴意义」· C头文件 代码 · 共 1,316 行 · 第 1/3 页
H
1,316 行
m_view.Invalidate();
m_view.UpdateWindow();
}
return 0;
}
LRESULT OnFileClose(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ATLASSERT(!m_view.IsEmpty());
kSheetView* sheet = m_view.GetAt(m_view.Active());
if (IDCANCEL != QuerySave(sheet))
{
Send_RefreshStatusBar(_T("Ok. %s closed"), lstrlen(sheet->Path()) ? sheet->Path() : sheet->Name() );
m_view.Close(m_view.Active());
}
return 0;
}
LRESULT OnViewToolBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
m_bShowToolBar = !m_bShowToolBar;
CReBarCtrl rebar(m_hWndToolBar);
UINT iIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST + 1); // toolbar is band #1
rebar.ShowBand(iIndex, m_bShowToolBar);
UISetCheck(ID_VIEW_TOOLBAR, m_bShowToolBar);
UpdateLayout();
return 0;
}
LRESULT OnViewFormat(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
m_bShowFormatBar = !m_bShowFormatBar;
CReBarCtrl rebar(m_hWndToolBar);
UINT iIndex = rebar.IdToIndex(ATL_IDW_BAND_FIRST + 2); // formatbar is band #2
rebar.ShowBand(iIndex, m_bShowFormatBar);
UISetCheck(ID_VIEW_FORMAT, m_bShowFormatBar);
UpdateLayout();
return 0;
}
LRESULT OnViewStatusBar(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
m_bShowStatusBar = !::IsWindowVisible(m_hWndStatusBar);
::ShowWindow(m_hWndStatusBar, m_bShowStatusBar ? SW_SHOWNOACTIVATE : SW_HIDE);
UISetCheck(ID_VIEW_STATUS_BAR, m_bShowStatusBar);
UpdateLayout();
return 0;
}
LRESULT OnOption(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
kOptionDlg *dlg = 0;
if (m_view.IsEmpty())
{
dlg = new kOptionDlg( m_defOption, kOptionDlg::applyDefault );
}
else
{
kOption option;
m_view.GetAt(m_view.Active())->GetOption(option);
dlg = new kOptionDlg( option, kOptionDlg::applyActive );
}
if ((IDOK == dlg->DoModal()) || (0 != dlg->m_nChange))
{
switch (dlg->m_nApply)
{
case kOptionDlg::applyDefault:
m_defOption = dlg->m_option;
break;
case kOptionDlg::applyActive:
m_view.GetAt(m_view.Active())->SetOption(dlg->m_option, dlg->m_nChange);
break;
case kOptionDlg::applyActiveDefault:
m_defOption = dlg->m_option;
m_view.GetAt(m_view.Active())->SetOption(dlg->m_option, dlg->m_nChange);
break;
default:
ATLASSERT(0);
}
}
delete dlg;
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 (!m_view.IsEmpty())
{
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));
}
return 0;
}
bHandled = FALSE;
return 0;
}
void UpdateUIAll()
{
bool bViewExists = !m_view.IsEmpty();
bool bCanUndo = false;
bool bCanRedo = false;
bool bCanPaste = false;
bool bHasSelection = false;
bool bNotEmpty = false;
bool bWordWrap = false;
bool bIsBold = false;
bool bIsItalic = false;
bool bIsUnderline = false;
bool bIsLeftAlign = false;
bool bIsRightAlign = false;
bool bIsCntAlign = false;
bool bIsJustify = false;
bool bUpdateTitle = true;
m_comboFont.EnableWindow(bViewExists);
m_comboSize.EnableWindow(bViewExists);
if (bViewExists)
{
kSheetView* sheet = m_view.GetAt(m_view.Active());
bCanUndo = sheet->CanUndo() != 0;
bCanRedo = sheet->CanRedo() != 0;
bCanPaste = sheet->CanPaste() != 0;
bHasSelection = sheet->HasSelection() != 0;
bNotEmpty = sheet->GetWindowTextLength() > 0;
bWordWrap = sheet->IsWordWrap();
bIsBold = sheet->IsEffect(CFM_BOLD, CFE_BOLD);
bIsItalic = sheet->IsEffect(CFM_ITALIC, CFE_ITALIC);
bIsUnderline = sheet->IsEffect(CFM_UNDERLINE, CFE_UNDERLINE);
switch (sheet->GetAlign())
{
case PFA_LEFT: bIsLeftAlign = true; break;
case PFA_RIGHT: bIsRightAlign = true; break;
case PFA_CENTER: bIsCntAlign = true; break;
case PFA_JUSTIFY: bIsJustify = true; break;
default: break;
}
// update toolbar combo box
if (GetFocus() == sheet->m_hWnd)
{
CHARFORMAT2 cf;
TCHAR szName[LF_FACESIZE];
m_comboFont.GetWindowText(szName, LF_FACESIZE );
sheet->GetCharFormatEx(cf, CFM_FACE | CFM_SIZE);
if (lstrcmp(szName, cf.szFaceName))
if (m_comboFont.SetSelFont(cf) == CB_ERR)
m_comboFont.SetCurSel( -1 );
int iComboSize = 0;
int i = m_comboSize.GetCurSel();
if (i != CB_ERR) iComboSize = font_size[i];
int iSelSize = cf.yHeight / 20;
if (iComboSize != iSelSize)
{
TCHAR str[10];
wsprintf(str, _T("%d"), iSelSize);
if (m_comboSize.SelectString(-1, str) == CB_ERR)
m_comboSize.SetCurSel( -1 );
}
}
bUpdateTitle = m_bModified != sheet->IsDirty();
OnRefreshColRow();
}
if (bUpdateTitle)
{
UpdateTitle();
}
UIEnable(ID_FILE_SAVE, bViewExists);
UIEnable(ID_FILE_SAVE_AS, bViewExists);
UIEnable(ID_FILE_CLOSE, bViewExists);
UIEnable(ID_FILE_PRINT, bViewExists);
UIEnable(ID_FILE_PRINT_PREVIEW, bViewExists);
UIEnable(ID_FILE_PRINT_SETUP, bViewExists);
UIEnable(ID_EDIT_WORD_WRAP, bViewExists);
UIEnable(ID_FORMAT_FONT, bViewExists);
UIEnable(ID_FORMAT_COLOR, bViewExists);
UIEnable(ID_FORMAT_BGRN, bViewExists);
UIEnable(ID_FORMAT_HIGHLIGHT, bViewExists);
UIEnable(ID_FORMAT_BOLD, bViewExists);
UIEnable(ID_FORMAT_ITALIC, bViewExists);
UIEnable(ID_FORMAT_UNDERLINE, bViewExists);
UIEnable(ID_FORMAT_CNT, bViewExists);
UIEnable(ID_FORMAT_LEFT, bViewExists);
UIEnable(ID_FORMAT_RIGHT, bViewExists);
UIEnable(ID_FORMAT_JST, false); //bViewExists
UIEnable(ID_EDIT_UNDO, bCanUndo);
UIEnable(ID_EDIT_REDO, bCanRedo);
UIEnable(ID_EDIT_PASTE, bCanPaste);
UIEnable(ID_EDIT_CUT, bHasSelection);
UIEnable(ID_EDIT_COPY, bHasSelection);
UIEnable(ID_EDIT_CLEAR, bHasSelection);
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, bWordWrap);
UISetCheck(ID_FORMAT_BOLD, bIsBold);
UISetCheck(ID_FORMAT_ITALIC, bIsItalic);
UISetCheck(ID_FORMAT_UNDERLINE, bIsUnderline);
UISetCheck(ID_FORMAT_LEFT, bIsLeftAlign);
UISetCheck(ID_FORMAT_RIGHT, bIsRightAlign);
UISetCheck(ID_FORMAT_CNT, bIsCntAlign);
UISetCheck(ID_FORMAT_JST, bIsJustify);
UIUpdateToolBar();
UpdateStatusBar();
}
LRESULT OnRefreshKeyboardLayout (UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
TCHAR sLang[MAX_PATH] = {0};
HKL hkl = (HKL)lParam;
if (0 == hkl)
{
hkl = GetKeyboardLayout(GetCurrentThreadId());
}
GetLocaleInfo(MAKELCID(hkl, SORT_DEFAULT), LOCALE_SLANGUAGE, sLang, MAX_PATH);
m_sbar.SetText(1, sLang);
return 0;
}
LRESULT OnRefreshColRow()
{
ATLASSERT(!m_view.IsEmpty());
kSheetView* sheet = m_view.GetAt(m_view.Active());
int nRow = 0; int nCol = 0;
sheet->GetCurrentRowCol(nRow, nCol);
TCHAR szBuff[100];
wsprintf(szBuff, _T("Row: %i"), nRow);
m_sbar.SetPaneText(ID_ROW_PANE, szBuff);
wsprintf(szBuff, _T("Col: %i"), nCol);
m_sbar.SetPaneText(ID_COL_PANE, szBuff);
return 0;
}
LRESULT OnToolbarDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
NMTOOLBAR* ptb = (NMTOOLBAR *) pnmh;
ATLASSERT(ptb->iItem == ID_FILE_OPEN);
RECT rc;
CToolBarCtrl tbar(pnmh->hwndFrom);
BOOL b = tbar.GetItemRect(tbar.CommandToIndex(ptb->iItem), &rc);
b;
ATLASSERT(b);
tbar.MapWindowPoints(HWND_DESKTOP, (POINT *)&rc, 2);
CMenuHandle menuPopup(m_mru.GetMenuHandle());
m_CmdBar.TrackPopupMenu(menuPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, rc.left, rc.bottom);
return 0;
}
HWND CreateFormatToolbar ()
{
HWND hWndToolBarFormat = CreateSimpleToolBarCtrl(m_hWnd, IDR_FORMAT, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE, ID_FORMAT_TOOLBAR);
if (!hWndToolBarFormat)
return 0;
CToolBarCtrl m_fbar(hWndToolBarFormat);
CClientDC dc(m_hWnd);
dc.SelectFont((HFONT) GetStockObject( DEFAULT_GUI_FONT ));
TEXTMETRIC tm;
dc.GetTextMetrics( &tm );
int cxChar = tm.tmAveCharWidth;
int cyChar = tm.tmHeight + tm.tmExternalLeading;
int cx = (LF_FACESIZE + 4) * cxChar;
int cy = 16 * cyChar;
RECT rc;
TBBUTTONINFO tbi;
tbi.cbSize = sizeof TBBUTTONINFO;
tbi.dwMask = TBIF_STYLE | TBIF_SIZE;
tbi.fsStyle = TBSTYLE_SEP;
tbi.cx = (unsigned short)cx;
m_fbar.SetButtonInfo(1, &tbi);
m_fbar.GetItemRect(0, &rc);
// int left = rc.left;
rc.right -= cxChar * 8;
rc.bottom = cy;
HWND hWndFont = m_comboFont.CreateEx(m_hWnd, rc, -1, IDC_FONTNAME);
hWndFont;
ATLASSERT(hWndFont != 0);
rc.left = rc.right + 2; rc.right = rc.left + cxChar * 8 - 2;
HWND hWndSize = m_comboSize.Create(m_hWnd, rc, 0, WS_CHILD|WS_TABSTOP|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWN, 0, IDC_FONTSIZE, 0);
hWndSize;
ATLASSERT(hWndSize != 0);
m_comboSize.SetParent (hWndToolBarFormat);
m_comboFont.SetParent(hWndToolBarFormat);
m_comboSize.SetFont((HFONT)GetStockObject( DEFAULT_GUI_FONT ));
m_comboSize.LimitText(4);
TCHAR str[10];
for( int i=0; i < sizeof font_size / sizeof font_size[0]; i++ )
{
wsprintf(str, "%d", font_size[i] );
m_comboSize.AddString( str );
}
return hWndToolBarFormat;
}
LRESULT OnSelectFontName(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ATLASSERT(!m_view.IsEmpty());
CHARFORMAT2 cf;
memset(&cf, 0, sizeof CHARFORMAT2);
m_comboFont.GetLBText( m_comboFont.GetCurSel(), cf.szFaceName );
kSheetView* sheet = m_view.GetAt(m_view.Active());
sheet->SetCharFormatEx(cf, CFM_FACE);
return 0;
}
LRESULT OnSelectFontSize(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
ATLASSERT(!m_view.IsEmpty());
CHARFORMAT2 cf;
memset(&cf, 0, sizeof CHARFORMAT2);
cf.yHeight = 160; //e.g. 8 point
int i = m_comboSize.GetCurSel();
if (i != CB_ERR)
cf.yHeight = font_size[i] * 20;
kSheetView* sheet = m_view.GetAt(m_view.Active());
sheet->SetCharFormatEx(cf, CFM_SIZE);
return 0;
}
LRESULT UpdateTitle()
{
TCHAR sTitle[256] = {0};
::LoadString(_Module.GetResourceInstance(), IDR_MAINFRAME, sTitle, 256);
if (!m_view.IsEmpty())
{
kSheetView* sheet = m_view.GetAt(m_view.Active());
lstrcat(sTitle, _T(" - "));
lstrcat(sTitle, sheet->Name());
if (sheet->IsDirty())
lstrcat(sTitle, _T("*"));
m_bModified = sheet->IsDirty();
}
SetWindowText(sTitle);
return 0;
}
LRESULT OnChangeSheet(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
{
UpdateTitle();
return 0;
}
DWORD QuerySave(kSheetView* sheet)
{
if (!sheet->IsDirty())
return IDYES;
TCHAR sTitle[256] = {0};
::LoadString(_Module.GetResourceInstance(), IDR_MAINFRAME, sTitle, 256);
TCHAR sMsg[_MAX_PATH + 20];
wsprintf(sMsg, _T("Save changes to %s?"), lstrlen(sheet->Path()) ? sheet->Path() : sheet->Name());
DWORD dwRes = MessageBox (sMsg, sTitle, MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1);
if (IDYES == dwRes)
{
BOOL b;
OnFileSave(0, ID_FILE_SAVE, 0, b);
}
return dwRes;
}
virtual bool DoFileOpen (const TCHAR* sPath, bool bUpdateRecent = true)
{
kSheetView* sheet = m_view.Add();
sheet->SetOption(m_defOption);
sheet->SetModify(FALSE);
UpdateProgressBar();
CWaitCursor wait;
bool b = sheet->Load(sPath);
UpdateProgressBar(false);
if (b)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?