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