Chapter 8 Dialog Boxes and Property Sheet
Two kinds of dialog boxes Modal dialog When appear, it takes all ownership of input. It disables the window until the dialog box is dismissed. Modeless dialog It behaves more like a conventional window. It activates together with other windows.
Modal Dialog box MFC Class Heirarchy
Modal dialog box How to create and show it ① Design a dialog box template Resource View ② Create a CDialog derived class using the template Use [Project] [add class] menu ③ Call CDialog::DoModal() function to show the dialog box
Modal dialog box Main Virtual functions of CDialog class WM_INITDIALOG message handler When initializes the dialog box Good place for initializing other controls IDOK message handler (when pressing OK button) Good place for updating variables before closing the dialog box, virtual BOOL CDialog::OnInitDialog ( ); virtual void CDialog::OnOK ( );
Modal dialog box Main Virtual functions of CDialog class IDCANCEL message handler (when pressing cancel button) Close the dialog box virtual void CDialog::OnCancel ( );
DDX/DDV What you have to: IDC_STR IDC_COLOR ① ② Dialog box m_str m_color Dialog variables Parent variables ③ ④ When showing dialog box When pressing OK button
DDX/DDV An automatic way: DDX(Dialog Data eXchange) IDC_STR IDC_COLOR ① ② Dialog box m_str m_color Dialog variables Parent variables ③ ④ Automation?
DDX/DDV Implementation of DDX Connecting a variable with a control Use DDX_* MACRO void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, IDC_STR, m_str); DDX_Text(pDX, IDC_COLOR, m_color); //}}AFX_DATA_MAP }
DDX/DDV OnInitDialog(), OnOK() implementation BOOL CDialog::OnInitDialog() { ... UpdateData(FALSE); // Give the values to the controls } void CDialog::OnOK() UpdateData(TRUE); // Retrieve the values // from the controls
DDX/DDV DDV(Dialog Data Validation) Automation of the validation of the data Check the range of the data Use DDV_* MACRO void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, IDC_STR, m_str); DDV_MaxChars(pDX, m_str, 10); DDX_Text(pDX, IDC_COLOR, m_color); DDV_MinMaxInt(pDX, m_color, 0, 255); //}}AFX_DATA_MAP }
Coding Practice Create a dialog box as shown below and show it when pressing mouse left button Type on the edit control and choose a text color value from the radio buttons
Two types of dialog boxes Modal dialog When appear, it takes all ownership of input. It disables the window until the dialog box is dismissed. Modaless dialog It behaves more like a conventional window. It activates together with other windows.
Modaless Dialog Box Same thing: Different thing: Create a dialog template and add a CDialog-derived class. Different thing: Do not use CDialog::DoModal() function Use CDialog::Create() function for initialization Ex: CDialog::Create( Resource_ID, parent_wnd); Use CDialog::ShowWindow() function for showing Use CWnd::DestroyWindow() function to close
Modaless dialog box test Create a dialog box as shown below and show it as a modaless dialog box. Type on the edit control and choose a text color value from the radio buttons
Common Dialog Boxes
Common Dialog Box MFC Class Hierarchy
Common Dialog Dlasses Class Dialog Type(s) CFileDialog Open and Save As dialog boxes CPrintDialog Print and Print Setup dialog boxes CPageSetupDialog Page Setup dialog boxes CFindReplaceDialog Find and Replace dialog boxes CColorDialog Color dialog boxes CFontDialog Font dialog boxes
CColorDialog CColorDialog dlg; dlg.DoModal(); COLORREF color = dlg.GetColor(); CColorDialog dlg(RGB(255, 0, 0), CC_FULLOPEN); dlg.DoModal(); COLORREF color = dlg.GetColor();
CFileDialog CFileDialog dlg(TRUE); if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName()); CFileDialog dlg(FALSE); if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());
CFontDialog CFontDialog dlg; if(dlg.DoModal() == IDOK){ CClientDC dc(this); // Get Color COLORREF color = dlg.GetColor(); dc.SetTextColor(color); // Get Font LOGFONT lf; dlg.GetCurrentFont(&lf); CFont font; font.CreateFontIndirect(&lf); dc.SelectObject(&font); // Show Text dc.TextOut(10, 10, CString("한글 & English")); }
CPageSetupDialog CPageSetupDialog dlg; dlg.DoModal();
CPrintDialog CPrintDialog dlg(TRUE); dlg.DoModal(); CPrintDialog dlg(FALSE); dlg.DoModal();
Part II Document/View Architecture
Chapter 9 Documents, Views, and the Single Document Interface
Document/View Fundamentals Single document/view architecture
Document/View Fundamentals Application object: Provides message loop and send messages to the frame window and the view Frame Window object: Shows menu, toolbar and status bar View object: Displays(renders) data Translates mouse and keyboard input into commands to operates the data Document object: Stores data Manipulates data
SDI and MDI Single Document Interface vs. Multiple Document Interface Different in the number of documents to open at once
Document Template Document Template MFC Class Hierarchy Identifies the document class, view class and frame window class. Stores the resource ID for menu, tool bar and other resources for the frame window MFC Class Hierarchy SDI MDI
Document Template Initial Setting for an application: InitInstance() BOOL CExFileApp::InitInstance() { ... CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExFileDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExFileView)); AddDocTemplate(pDocTemplate); }
Single Document Interface Example (1/4) New Project: Single Document + Document/View Support
Single Document Interface Example (2/4) Change OnDraw function of View Class void CExFileView::OnDraw(CDC* pDC) { CExFileDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->SetMapMode(MM_LOMETRIC); pDC->Ellipse(100, -100, 600, -600); }
Single Document Interface Example (3/4) Result
Single Document Interface Example (4/4) 실행 결과 (cont'd)
SDI Application A Simple Structure CWinApp CFrameWnd CSingleDocTemplate CDocument CView
SDI Application A structure with two views CWinApp CSingleDocTemplate CDocument CView 1 CFrameWnd CView 2
GetFirstViewPosition GetFirstDocTemplatePosition SDI Application How to refer each other Document Object View Frame Window GetFirstViewPosition & GetNextView GetDocument GetActiveDocument GetActiveView Application AfxGetMainWnd AfxGetApp m_pMainWnd GetParentFrame Document Template GetFirstDocTemplatePosition & GetNextDocTemplate GetDocTemplate GetFirstDocPosition & GetNextDoc
SDI Application Key Functions CWinApp* AfxGetApp ( ); Return the pointer to the application object CWnd* AfxGetMainWnd ( ); Return the pointer to the frame window object CView* CFrameWnd::GetActiveView ( ); Return the pointer to the view object CDocument* CView::GetDocument ( ); Return the pointer to the document object POSITION CDocument::GetFirstViewPosition ( ); CView* CDocument::GetNextView (POSITION& rPosition); Access to the view object(s) Document Object m_viewList View #1 View #2 View #3 NULL
Document/View in detail Create a new application as a SDI Edit the document template string
Document/View in detail Document template string ExSDI\n\nExSDI\nExSDI 파일 (*.sdi)\n.sdi\nExSDI.Document ① ② ③ ④ ⑤ ⑥ \nExSDI Document ⑦ No. Description 1 Title shown on the title bar 2 A initial name of the document. If skipped, “untitled” will be given 3 Brief name of the document 4 Brief name of the document in file dialog box 5 Default extension name 6 Document ID used in the windows registry 7 Document name used in the windows registry
Document Class Key CDocument operations Function Description GetFirstViewPosition Returns a POSITION value that can be passed to GetNextView to begin enumerating the views associated with this document GetNextView Returns a CView pointer to the next view in the list of views associated with this document GetPathName Retrieves the document's file name and path—for example, "C:\Documents\Personal\MyFile.doc"; returns an empty string if the document hasn't been named GetTitle Retrieves the document's title—for example, "MyFile"; returns an empty string if the document hasn't been named IsModified Returns a nonzero value if the document contains unsaved data or 0 if it doesn't SetModifiedFlag Sets or clears the document's modified flag, which indicates whether the document contains unsaved data UpdateAllViews Updates all views associated with the document by calling each view's OnUpdate function
Document Class Key CDocument Overrides Function Description OnNewDocument Called by the framework when a new document is created. Override to apply specific initializations to the document object each time a new document is created. OnOpenDocument Called by the framework when a document is loaded from disk. Override to apply specific initializations to the document object each time a document is loaded. DeleteContents Called by the framework to delete the document's contents. Override to free memory and other resources allocated to the document before it is closed. Serialize Called by the framework to serialize the document to or from disk. Override to provide document-specific serialization code so that documents can be loaded and saved.
Document class What happens when: [FILE]->[New] [FILE]->[Open...] [FILE]->[Save] or [File]->[Save as...] DeleteContents() OnNewDocument() DeleteContents() Serialize() OnOpenDocument() Serialize()
View Class Key CView Overrides Function Description OnDraw Called to draw the document's data. Override to paint views of a document. OnInitialUpdate Called when a view is first attached to a document. Override to initialize the view object each time a document is created or loaded. OnUpdate Called when the document's data has changed and the view needs to be updated. Override to implement "smart" update behavior that redraws only the part of the view that needs redrawing rather than the entire view.
Coding practice Using Document/View architecture, make an application which draws circles and save/load it Things to change CView:: OnDraw() CDocument:: OnNewDocument() Serialize()