
Two kinds of dialog boxes • 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 ( );
Dialog box Dialog variables Parent variables IDC_STR IDC_COLOR m_str m_color m_str m_color When showing dialog box ② ① Dialog box Dialog variables Parent variables IDC_STR IDC_COLOR m_str m_color m_str m_color When pressingOK button ③ ④ DDX/DDV • What you have to:
Automation? Dialog box Dialog variables Parent variables IDC_STR IDC_COLOR m_str m_color m_str m_color ② ① Dialog box Dialog variables Parent variables IDC_STR IDC_COLOR m_str m_color m_str m_color ③ ④ DDX/DDV • An automatic way: • DDX(Dialog Data eXchange)
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 • 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: • 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 Box • MFC Class Hierarchy
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();
Chapter 9Documents, 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
SDI MDI Document Template • Document Template • 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
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 (4/4) • 실행 결과 (cont'd)
SDI Application • A Simple Structure CFrameWnd CWinApp CSingleDocTemplate CDocument CView
CFrameWnd CWinApp CView 1 CSingleDocTemplate CDocument CView 2 SDI Application • A structure with two views
GetFirstViewPosition & GetNextView Document Object View Object GetDocument GetActiveDocument GetActiveView GetParentFrame GetDocTemplate Frame Window Object AfxGetMainWnd GetFirstDocPosition & GetNextDoc m_pMainWnd Document Template Application Object AfxGetApp GetFirstDocTemplatePosition & GetNextDocTemplate SDI Application • How to refer each other
View #1 View #2 View #3 Document Object m_viewList NULL 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/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 ⑦
Document Class • Key CDocument operations
Document Class • Key CDocument Overrides
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
Coding practice • Using Document/View architecture, make an application which draws circles and save/load it Things to change CView:: OnDraw() CDocument:: OnNewDocument() Serialize()