Visual C++ Programming

Download Report

Transcript Visual C++ Programming

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.
• It activates together with other windows.
2
Modal Dialog box
• MFC Class Heirarchy
3
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
4
Modal dialog box
• Main Virtual functions of CDialog class
virtual BOOL CDialog::OnInitDialog ( );
– WM_INITDIALOG message handler
– When initializes the dialog box
– Good place for initializing other controls
virtual void CDialog::OnOK ( );
– IDOK message handler (when pressing OK button)
– Good place for updating variables before closing the
dialog box,
5
Modal dialog box
• Main Virtual functions of CDialog class
virtual void CDialog::OnCancel ( );
– IDCANCEL message handler (when pressing cancel
button)
– Close the dialog box
6
DDX/DDV
• What you have to:
Dialog box
IDC_STR
IDC_COLOR
Dialog variables
②
Dialog box
IDC_STR
IDC_COLOR
m_str
m_color
Dialog variables
③
m_str
m_color
Parent variables
m_str
m_color
①
When showing
dialog box
Parent variables
④
m_str
m_color
When pressing
OK button
7
DDX/DDV
• An automatic way:
– DDX(Dialog Data eXchange)
Automation?
Dialog box
IDC_STR
IDC_COLOR
Dialog variables
②
Dialog box
IDC_STR
IDC_COLOR
m_str
m_color
Dialog variables
③
m_str
m_color
Parent variables
m_str
m_color
①
Parent variables
④
m_str
m_color
8
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
}
9
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
10
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
}
11
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.
13
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
14
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
17
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
18
CColorDialog
CColorDialog dlg;
dlg.DoModal();
COLORREF color = dlg.GetColor();
CColorDialog dlg(RGB(255, 0, 0), CC_FULLOPEN);
dlg.DoModal();
COLORREF color = dlg.GetColor();
19
CFileDialog
CFileDialog dlg(TRUE);
if(dlg.DoModal() == IDOK)
MessageBox(dlg.GetPathName());
CFileDialog dlg(FALSE);
if(dlg.DoModal() == IDOK)
MessageBox(dlg.GetPathName());
20
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"));
}
21
CPageSetupDialog
CPageSetupDialog dlg;
dlg.DoModal();
22
CPrintDialog
CPrintDialog dlg(TRUE);
dlg.DoModal();
CPrintDialog dlg(FALSE);
dlg.DoModal();
23
Part II
Document/View Architecture
Chapter 9
Documents, Views, and
the Single Document Interface
Document/View Fundamentals
• Single document/view architecture
26
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
27
SDI and MDI
• Single Document Interface
vs.
Multiple Document Interface
– Different in the number of documents to open at once
28
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
SDI
MDI
29
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);
...
}
30
Single Document Interface Example (1/4)
• New Project:
– Single Document + Document/View Support
31
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);
}
32
Single Document Interface Example (3/4)
• Result
33
Single Document Interface Example (4/4)
• 실행 결과 (cont'd)
34
SDI Application
• A Simple Structure
CWinApp
CFrameWnd
CSingleDocTemplate
CDocument
CView
35
SDI Application
• A structure with two views
CWinApp
CFrameWnd
CView 1
CSingleDocTemplate
CDocument
CView 2
36
SDI Application
• How to refer each other
GetFirstViewPosition
& GetNextView
Document
Object
View
Object
GetDocument
GetActiveDocument
GetDocTemplate
GetFirstDocPosition
& GetNextDoc
Document
Template
GetActiveView
Frame Window
Object
GetParentFrame
AfxGetMainWnd
m_pMainWnd
Application
Object
GetFirstDocTemplatePosition
& GetNextDocTemplate
AfxGetApp
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)
View #1
Document Object
m_viewList
View #2
View #3
NULL
38
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
40
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:\Docume
nts\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. Ov
erride to apply specific initializations to the document object e
ach time a new document is created.
OnOpenDocument Called by the framework when a document is loaded from dis
k. Override to apply specific initializations to the document ob
ject each time a document is loaded.
DeleteContents
Called by the framework to delete the document's contents. O
verride to free memory and other resources allocated to the d
ocument 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.
42
Document class
• What happens when:
– [FILE]->[New]
DeleteContents()  OnNewDocument()
– [FILE]->[Open...]
DeleteContents()  Serialize()  OnOpenDocument()
– [FILE]->[Save] or [File]->[Save as...]
Serialize()
43
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 n
eeds to be updated. Override to implement "smart" update be
havior that redraws only the part of the view that needs redra
wing rather than the entire view.
44
Coding practice
• Using Document/View architecture, make an
application which draws circles and save/load it
Things to change
CView::
OnDraw()
CDocument::
OnNewDocument()
Serialize()