460 likes | 720 Views
Chapter 8 Dialog Boxes and Property Sheet. 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.
E N D
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()