MFC Windows程序设计--对话框,属性表

    xiaoxiao2021-04-15  70

    1.

    模式 无模式

    属性表: CPropertySheet,CPropertyPage

    2.模式对话框

    创建模式对话框: 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_ICON

    WS_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_AUTOHSCROLL

    CDialog: 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是对话框特有的,对话框和传统窗口接收的消息完全相同。

    3.对话框数据交换和数据校验

    3.1.DDX

    方式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将整型变量和滚动条联系

    3.2.DDV

    DDV:检验数值在指定范围。检验CString变量长度在指定范围。

    DDV适合数据类型DDV_MinMaxByteByteDDV_MinMaxIntIntDDV_MinMaxLongLongDDV_MinMaxUIntUIntDDV_MinMaxDwordDWORDDDV_MinMaxFloatfloatDDV_MinMaxDoubleDoubleDDV_MaxChars限制输入的字符数

    3.3.DDX,DDV驱动

    CDialog::OnInitDialog调用UpdateData(FALSE),进而调用DoDataExchange使DDX完成用变量初始化控件。 CDialog::OnOk调用UpdateData(TRUE),进而调用DoDataExchange使DDX完成用控件值来给变量赋值。使DDV进行变量合法性检查。

    3.4.与对话框控件相互作用

    // 1. CListBox *pListBox = (CListBox*)GetDlgItem(IDC_LIST); pListBox->AddString(_T("One")); // 2. CListBox wndListBox; wndListBox.Attach(GetDlgItem(IDC_LIST)->m_hWnd); wndListBox.AddString(_T("One")); wndListBox.Detach(); // 3. DDX_ControlMFC控件类实例挂接到对话框控件上 XXX::DoDataExchange(...) { DDX_Control(pDX, IDC_LIST, m_wndListBox); } // IDC_PHONE对应RCCEdit // m_wndPhoneEditCEdit派生类 // 利用这种方法实现自定义对话框控件类型的控制 DDX_Control(pDx, IDC_PHONE, m_wndPhoneEdit);

    无模式对话框

    显示无模式对话框用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
    转载请注明原文地址: https://ju.6miu.com/read-670878.html

    最新回复(0)