模式 无模式
属性表: CPropertySheet,CPropertyPage
创建模式对话框: 1.创建 对话框模板。 2.构造一个 CDialog或派生类对象,封装模板。 3.CDialog::DoModal,DoModal直到对话框被清除后才返回值,返回的是传给EndDialog的值。
//对话框模板 IDD_MYDIALOG DIALOG 0, 0, 160, 68 STYLE DS_MODALFRAME WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Enter your name" Font 8, "Ms Sans Serif" BEGIN LTEXT "&Name", -1, 8, 14, 24, 8 EDITTEXT IDC_NAME, 34, 12, 118, 12, ES_AUTOHSCROLL DEFPUSHBUTTON "Ok", IDOK, 60, 34, 40, 14, WS_GROUP PUSHBUTTON "Cancel", IDCANCEL, 112, 34, 40, 14, WS_GROUP END // 模板中所有尺寸用对话框单位表示 // 水平上,一个对话框单位约为字体中字符宽1/4 // 竖直上,约为字符高1/8模板中每个控件关键字都有相关默认样式。可用Not取消隐含的默认样式。
// 两种定义控件方式 1.EDITTEXT IDC_EDIT, 32, 16, 96, 12, NOT WS_TABSTOP 2.CONTROL "", IDC_NAME, "EDIT", WS_BORDER | ES_AUTOHSCROLL | ES_LEFT | WS_TABSTOP, 34, 12, 118, 12 // CONTROL语句的参数3指定控件的基础WNDCLASS。和关键字有所区别。 // 自定义控件通过CONTROL完成定义。 关键字默认样式LTEXTSS_LEFT WS_GROUPCTEXTSS_CENTER WS_GROUPRTEXTSS_RIGHT WS_GROUPPUSHBUTTONBS_PUSHBUTTON WS_TABSTOPDEFPUSHBUTTONBS_DEFPUSHBUTTON WS_TABSTOPEDITTEXTES_LEFT WS_BORDER WS_TABSTOPCHECKBOXBS_CHECKBOX WS_TABSTOPAUTOCHECKBOXBS_AUTOCHECKBOX WS_TABSTOPSTATE3BS_3STATE WS_TABSTOPAUTO3STATEBS_AUTO3STATE WS_TABSTOPRADIOBUTTONBS_RADIOBUTTON WS_TABSTOPAUTORADIOBUTTONBS_AUTORADIOBUTTON WS_TABSTOPGROUPBOXBS_GROUPBOXLISTBOXLBS_NOTIFY WS_BORDERCOMBOBOXCBS_SIMPLESCROLLBARSBS_HORZICONSS_ICONWS_CHILD, WS_VISIBLE 对所有控件均是隐含的。 控件需含有WS_TABSTOP样式才能获得输入焦点。
对话框键盘界面: RC文件中定义对话框模板时,也影响了对话框键盘接口。 几个影响键盘接口的因素:
1.控件定义顺序。 2.控件正文用“&”指定的快捷键。 3.WS_GROUP 4.DEFPUSHBUTTON
// 按下Alt-N,因LTEXT无法获得焦点,焦点传给下一个控件 LTEXT "&Name", -1, 8, 14, 24, 8 EDITTEXT IDC_NAME, 34, 12, 118, 12, ES_AUTOHSCROLLCDialog: OnInitDialog OnOk OnCancel
对话框收到WM_CREATE时,模板中指定的控件还未被创建。 收到WM_INITDIALOG时,所有控件已经创建,可以在此进行初始化。
OnInitDialog执行时,对话框尚未被显示,返回TRUE,则Windows将输入焦点指派给制表键控制次序中的第一个控件。如把输入焦点给其它控件,应返回FALSE,且在OnInitDialog中用SetFocus设置焦点。
GetDlgItem(UINT) // 由控件ID获得CWnd*指针。
对ID为IDOK的,自动映射到OnOK。 对ID为IDCANCEL或按下Esc或点击关闭按钮,自动映射到OnCancel。 CDialog::EndDialog用于使模态对话框消失。
除WM_INITDIALOG是对话框特有的,对话框和传统窗口接收的消息完全相同。
方式1
// .h class CMyDialog : public CDialog { public: CMyDialog(CWnd * pParentWnd = NULL) : CDialog(IDD_MYDIALOG, pParentWnd) {} CString m_strName; CString m_strPhone; protected: virtual BOOL OnInitDialog(); virtual void OnOK(); }; // .cpp BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); SetDlgItemText(IDC_NAME, m_strName); SetDlgItemText(IDC_PHONE, m_strPhone); return TRUE; } void CMyDialog::OnOK() { GetDlgItemText(IDC_NAME, m_strName); GetDlgItemText(IDC_PHONE, m_strPhone); return TRUE; }方式2
// pDX用于通报信息的流向 void CMyDialog::DoDataExchange(CDataExchange *pDX) { DDX_TEXT(pDX, IDC_NAME, m_strName); DDX_TEXT(pDX, IDC_PHONE, m_strPhone); }OnInitDialog和OnOk均会触发一次DoDataExchange。
控件与数据成员间的关系取决于联系两者的DDX函数。
DDX说明DDX_Text将BYTE,int,short,UINT,long,DWORD,CString,string,float,double,COleDataTime,COleCurrency变量与编辑控件联系DDX_Check将整型变量与复选框关联DDX_Radio将整型变量与一组单选按钮联系DDX_LBIndex将整型变量与列表框联系DDX_LBString将CString变量和列表框联系DDX_LBStringExact将CString变量和列表框联系DDX_CBIndex将整型变量与组合框联系DDX_CBString将CString变量与组合框联系DDX_CBStringExact将CString变量与组合框联系DDX_Scroll将整型变量和滚动条联系DDV:检验数值在指定范围。检验CString变量长度在指定范围。
DDV适合数据类型DDV_MinMaxByteByteDDV_MinMaxIntIntDDV_MinMaxLongLongDDV_MinMaxUIntUIntDDV_MinMaxDwordDWORDDDV_MinMaxFloatfloatDDV_MinMaxDoubleDoubleDDV_MaxChars限制输入的字符数CDialog::OnInitDialog调用UpdateData(FALSE),进而调用DoDataExchange使DDX完成用变量初始化控件。 CDialog::OnOk调用UpdateData(TRUE),进而调用DoDataExchange使DDX完成用控件值来给变量赋值。使DDV进行变量合法性检查。
显示无模式对话框用CDialog::Create,一建立就返回。 清除用DestroyWindow,无模式对话框不能用EndDialog。
无模式对话框,一般用new产生对象时,可以覆盖CDialog::PostNcDestroy在其中加入 delete this,来保证窗口销毁时,对象被析构。
无模式对话框按下Esc和关闭按钮时,默认调用OnCancel,由于对话框默认版本会调用EndDialog,不适合无模式。故无模式对话框总要覆盖OnCancel,避免其调用EndDialog。
WM_MESSAGE :应用程序自定义消息 自定义消息ID范围:(WM_USER, 0x7FFF) 用户自定义消息的返回值,通过SendMessage的返回值传递给调用者。CPropertySheet CPropertyPage
模式属性表:CPropertySheet::DoModal 无模式:CPropertySheet::Create
创建模式属性表: 1.对属性表的每一页创建一对话框模板。 2.对属性表的每一页由CPropertyPage派生一个类。 3.由 CPropertySheet派生一个类。CPropertySheet.AddPage将每页加入。 4.CPropertySheet::DoModal
CPropertyPage:: SetModified OnInitDialog OnSetActive OnKillActive OnOK OnCancel
CPropertySheet:: GetActivePage
CFileDialog Open和Save As CPrintDialog Print和Print Setup CPageSetUpDialog Page Setup CFindReplaceDialog CColorDialog CFontDialog
// TCHAR szFilters[] = _T("Text files(*.txt) | *.txt | All files(*.*) | *.* ||"); CFileDialog dlg(TRUE, _T("txt"), _T("*.txt"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters); if(dlg.DoModal() == IDOK) { filename = dlg.GetPathName(); ... } CFileDialog::m_ofn