Title: Dialog Boxes and Property Sheets Prosise, Chapter 8
1Dialog Boxes and Property SheetsProsise, Chapter
8
- Jim Fawcett
- CSE681 Advanced Windows Programming
- Summer 2003
- Derived from a presentations by
- Kevin Devaney and Ciahua Wang
2Dialog Boxes
- Modal
- Owner window disabled until dialog closed
- Modeless
- Owner window can be reactivated while dialog is
still open - Property Sheets
- Dialog boxes with tabbed pages
3Class Hierarchy
4Example Dialog Box
- Font dialog
- Controls
- Combo boxes
- List boxes
- Check boxes
- Push buttons
5Create a Simple Dialog App
- Use MFC AppWizard
- Visual C Menu
- File / New / MFC AppWizard
- Step 0 - Define project name and location
- Step 1 Choose Dialog-based
- Other Steps Accept defaults
6Using MFC AppWizard
7Add Dialog Controls
- Use toolbar to select controls for your dialog
- Click on the control you want
- Click on the dialog where you want to put the
control - Drag mouse on edges of the control to resize it
- Right-click on control, select properties and
provide new ID
8Creating MFC Dialog Application
9Selecting Application Type
10Resource Editor View
11Dialog Resource File (.rc)
- IDD_CREDIT_DIALOG DIALOGEX 0, 0, 265, 154
- STYLE DS_MODALFRAME WS_MINIMIZEBOX WS_POPUP
WS_VISIBLE WS_CAPTION WS_SYSMENU - EXSTYLE WS_EX_APPWINDOW
- CAPTION "Credit Card Calculator"
- FONT 8, "MS Sans Serif"
- BEGIN
- DEFPUSHBUTTON "Calculate",IDOK,198,102,41,14
- PUSHBUTTON "Exit",IDCANCEL,198,126,41,14
- CONTROL "Spin1",IDC_SPIN_DEBT,"msctls_
updown32",UDS_ARROWKEYS,21,22,11,14 - END
Resource file has dialog template Dialog box
characteristics (popup) Types of controls used
in the dialog (spin) Control position, size,
characteristics
12Adding Shortcut Keys
Exit
Right-click on control and select Properties
Alt-E will activate the Exit button
13Setting Tab Order
In Visual C menu, choose Layout/Tab Order
Current tab order will be shown
Click on controls in desired order to set a new
tab order
14Responding to User Input
- Double-click on the control
- Creates the default event handler, e.g.,
OnEnChangeEdit1 for EditBox. - To get more choices right click and select add
event handler. - Add code to handler function to perform needed
processing
15Adding an Event Handler
16Temperature Converter
IDC_EDIT_INPUT
IDC_EDIT_OUTPUT
17OnOK Processing
18How to talk to controls - 1
- Use CWnd functions
- GetDlgItemText, SetDlgItemText
- CheckRadioButton, GetCheckedRadioButton
- CheckDlgButton, IsDlgButtonChecked
- This was illustrated in Temperature Converter
example
19How to talk to controls - 2
- Use info supplied in the message handler
20How to talk to controls - 3
- Use common control classes
- CEdit, CListBox, CComboBox, CSliderCtrl, etc
- Use CWnd Attach function to associated control
class with your control
21Common Control Class Example
Remember to use Detach function if you create
the object on the stack
22How to talk to controls - 4
- Use Dynamic Data Exchange
- Override virtual function DoDataExchange
- Use DDX functions to associate member variables
with controls - Exchange occurs
- Input (variable to control) in OnInitDialog
- Output (control to variable) in OnOK
23DDX Example
24DDX Functions
- DDX_Text Edit control
- DDX_Check Check box
- DDX_Radio Radio box
- DDX_LBIndex, DDX_LBString List box
- DDX_CBIndex, DDX_CBString Combo box
- DDX_Scroll Scroll bar
25Dynamic Data Validation
- Dynamic data validation (DDV) works similar to
DDX - DDV checks that input data is within specified
limits - If data is outside limits, focus is passed to the
control and an error message is displayed
26DDV Example
27DDV Functions
- DDV_MinMaxByte, DDV_MinMaxInt,
- DDV_MinMaxLong, DDV_MinMaxUInt,
- DDV_MinMaxDWord, DDV_MinMaxFloat,
- DDV_MinMaxDouble, DDV_MaxChars
28Modal vs Modeless
- Modal
- Display dialog by calling CDialogDoModal
- Exit by calling CDialogOnOK or OnCancel
- Usually instantiated on the stack so destruction
is automatic
29Modal vs Modeless
- Modeless
- Display dialog by calling CDialogCreate
- Exit dialog by calling DestroyWindow
- Dont call OnOK or OnCancel
- Usually instantiated on the heap (new) so the
dialog is not destroyed prematurely - Make sure dialog is deleted by overriding
CDialogPostNcDestroy function using delete
this statement
30Basic Modal Dialog Programming (see example p.
398)
- Declare dialog member variables in header file
(.h) - Initialize variables and setup controls in
OnInitDialog - Use Class Wizard to create message handler
functions that get user input - Perform data processing in OnOK andcomment out
call to CdialogOnOK()
31Property Sheets
- Tabbed dialog boxes
- User can switch between pages using mouse
- MFC classes
- CPropertySheet
- CPropertyPage
32How to Create a Modal Property Sheet
- For each page create a dialog template.
- For each page derive a dialog-like class from
CPropertyPage that includes members linked to the
pages controls via DDX or DDV. - Derive a property sheet class from
CPropertySheet. - Use CPropertySheetAddPage() to add pages to the
property sheet. - Call the property sheets DoModal() to display
the property sheet.
33How to Create a Modal Property Sheet (cont.)
- MFC CPropertySheet provides functions for three
buttons -- OK, Cancel and Apply. - Property sheet pages should not include OK or
Cancel button --when the property sheets OK
button is clicked, the current pages OnOK() is
called. - Add message handler for Apply button, which
should call the active pages UpdateData(TRUE). - Use CPropertyPages SetModified() to enable or
disable Apply button.
34How to Create a Modal Property Sheet (cont.)
- class CFirstPagepublic CPropertyPage
- public .
- // delare member here
- protected
- virtual void DoDataExchange(CDataExchange)
. -
- class CMyPropertySheetpublic CProperySheet
- public .
- CFirstPage m_firstPage // first page ..
- CMyPropertySheet() // constructor
- AddPage(m_firstPage) .
35Common Dialogs
- CFileDialog
- CPrintDialog
- CPageSetupDialog
- CFindReplaceDialog
- CColorDialog
- CFontDialog
36CFileDialog
37CFileDialog code
TCHAR szFilters _T( "Text files
(.txt).txtAll files (.). ) CFileDialo
g dlg(TRUE, _T("txt"), _T(".txt"),
OFN_FILEMUSTEXIST OFN_HIDEREADONLY,
szFilters) if( dlg.DoModal() IDOK )
filename dlg.GetPathName()