[ Home | Syllabus | Course Notes | Assignments | Search]
Review Document/View
The simple text editor described in chapter 17, illustrates
document view
Toolbars
StatusBar
RichEditView
Remember Document/View applications have four main objects
Application object (usually derived from CWinApp like most
MFC applications)
Message handlers for NEW, OPEN, EXIT
MainFrame handles tool and status bars
Message handlers for "View" menu (controls tool/status bars)
View - derived from CRichEditView
Message handlers for typing, mouse selection, Edit menu
Document
Message handlers for SAVE SaveAs
//// review the only relevant function in the application object BOOL CMyWordApp::InitInstance() { // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyWordDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CMyWordView)); pDocTemplate->SetContainerInfo(IDR_CNTR_INPLACE); AddDocTemplate(pDocTemplate); // Enable DDE Execute open EnableShellOpen(); RegisterShellFileTypes(TRUE); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); // Enable drag/drop open m_pMainWnd->DragAcceptFiles(); return TRUE; }
Message handlers for all toolbar buttons provided by the framework
CStyleBar m_wndStyleBar; CStatusBar m_wndStatusBar; CToolBar m_wndToolBar;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // // Tell the frame window to permit docking. // EnableDocking (CBRS_ALIGN_ANY); // // Create the toolbar, style bar, and status bar. // if (!CreateToolBar () || !CreateStyleBar () || !CreateStatusBar ()) return -1; // // Load the saved bar state (if any). // LoadBarState (_T ("MainBarState")); return 0; }
void CMainFrame::OnClose() { SaveBarState (_T ("MainBarState")); CFrameWnd::OnClose(); }
BOOL CMainFrame::CreateToolBar() { if (!m_wndToolBar.Create (this) || !m_wndToolBar.LoadToolBar (IDR_MAINFRAME)) return FALSE; m_wndToolBar.SetBarStyle (m_wndToolBar.GetBarStyle () | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.SetWindowText (_T ("Main")); m_wndToolBar.EnableDocking (CBRS_ALIGN_ANY); DockControlBar (&m_wndToolBar); return TRUE; } BOOL CMainFrame::CreateStyleBar() { if (!m_wndStyleBar.Create (this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDW_STYLE_BAR)) return FALSE; m_wndStyleBar.SetWindowText (_T ("Styles")); m_wndStyleBar.EnableDocking (CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM); DockControlBar (&m_wndStyleBar); return TRUE; } BOOL CMainFrame::CreateStatusBar() { static UINT nIndicators[] = { ID_SEPARATOR, ID_INDICATOR_LINE, //// user added indicator (need message handler) ID_INDICATOR_CAPS, ID_INDICATOR_NUM }; if (!m_wndStatusBar.Create (this)) return FALSE; m_wndStatusBar.SetIndicators (nIndicators, 4); return TRUE; }
inherits from CRichEditDoc - not much left to do "class CMyWordDoc : public CRichEditDoc"
class CMyWordView : public CRichEditView
handles updating line number
afx_msg void OnUpdateLineNumber (CCmdUI* pCmdUI);
void CMyWordView::OnUpdateLineNumber(CCmdUI* pCmdUI) { int nLine = GetRichEditCtrl ().LineFromChar (-1) + 1; //// -1 means current line CString string; string.Format (_T ("Line %d"), nLine); pCmdUI->Enable (TRUE); pCmdUI->SetText (string); //// sets line number in status indicator }
Main tool bar - has icons for most used functions in menus
Built using the resource editor
Can add tool tips using prompt field
Mapped to existing message handlers provided by the document view framework
StyleBar is derived from CToolBar
handles enumeration of fonts
dynamic creation of drop down lists (define dummy icons in resource editor)
Lots of stuff to handle fonts
Maps message to View object to handle
CHARFORMAT data type handles font state information
void CMyWordView::OnInitialUpdate() { CRichEditView::OnInitialUpdate(); CHARFORMAT cf; //// information about the font cf.cbSize = sizeof (CHARFORMAT); //// set initial values cf.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_PROTECTED | CFM_STRIKEOUT | CFM_FACE | CFM_SIZE; cf.dwEffects = 0; cf.yHeight = 240; // 240 twips == 12 points ::lstrcpy (cf.szFaceName, _T ("Times New Roman")); SetCharFormat (cf); }
oid CMyWordView::OnCharBold() { CHARFORMAT cf; cf = GetCharFormatSelection (); //// current font format if (!(cf.dwMask & CFM_BOLD) || !(cf.dwEffects & CFE_BOLD)) cf.dwEffects = CFE_BOLD; else cf.dwEffects = 0; cf.dwMask = CFM_BOLD; SetCharFormat (cf); }
CComboBox m_wndFontNames; CComboBox m_wndFontSizes;
int CStyleBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { static int nFontSizes[] = { 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 48, 72 }; if (CToolBar::OnCreate(lpCreateStruct) == -1)//// base class does it's thing return -1; // // Load the toolbar. // if (!LoadToolBar (IDR_STYLE_BAR)) //// gets the icons from resource editor return -1; // // Create an 8-point MS Sans Serif font for the combo boxes. // CClientDC dc (this); m_font.CreatePointFont (80, _T ("MS Sans Serif")); CFont* pOldFont = dc.SelectObject (&m_font); TEXTMETRIC tm; dc.GetTextMetrics (&tm); //// need to calculate sizes int cxChar = tm.tmAveCharWidth; int cyChar = tm.tmHeight + tm.tmExternalLeading; dc.SelectObject (pOldFont); // // Add the font name combo box to the toolbar. // SetButtonInfo (8, IDC_FONTNAMES, TBBS_SEPARATOR, cxChar * 32); CRect rect; GetItemRect (8, &rect); rect.bottom = rect.top + (cyChar * 16); if (!m_wndFontNames.Create (WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT, rect, this, IDC_FONTNAMES)) return -1; m_wndFontNames.SetFont (&m_font); InitTypefaceList (&dc); // // Add the font size combo box to the toolbar. // SetButtonInfo (10, IDC_FONTSIZES, TBBS_SEPARATOR, cxChar * 12); GetItemRect (10, &rect); rect.bottom = rect.top + (cyChar * 14); if (!m_wndFontSizes.Create (WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rect, this, IDC_FONTSIZES)) return -1; m_wndFontSizes.SetFont (&m_font); CString string; int nCount = sizeof (nFontSizes) / sizeof (int); for (int i=0; i<nCount; i++) { string.Format (_T ("%d"), nFontSizes[i]); m_wndFontSizes.AddString (string); } return 0; }
void CStyleBar::InitTypefaceList (CDC* pDC) { ::EnumFontFamilies (pDC->m_hDC, NULL, (FONTENUMPROC) EnumFontNameProc, (LPARAM) this); } int CALLBACK CStyleBar::EnumFontNameProc (ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam) { CStyleBar* pWnd = (CStyleBar*) lParam; if (nFontType & TRUETYPE_FONTTYPE) pWnd->m_wndFontNames.AddString (lpelf->elfLogFont.lfFaceName); return 1; }