对话框类CDialog

一、对话框资源

  1、相关类

    CDialog类 -父类是CWnd,本质上也是一个窗口。是对话框类的顶层父类。

    CCommonDialog类 -父类是CDialog类。称为通用对话框。MFC提供了6个通用对话框,都是CCommonDialog类的子类,包括:文件对话框、颜色对话框、字体对话框、查找替换对话框、打印对话框、打印设置对话框。

    CPropertyPage -父类是CDialog类,属性页对话框。

  2、分类

    模式对话框和非模式对话框

  3、使用MFC的类创建基于模式对话框的应用程序

    3.1插入对话框资源,并与对话框类关联

    3.2创建和显示  CDialog::DoModal()

    3.3关闭  CDialog::OnOk()/OnCancel()

  4、使用MFC的类创建基于非模式对话框的应用程序

    4.1插入对话框资源,并与对话框类关联

    4.2创建和显示与一般框架窗口类似

    4.3关闭需要程序处理

      1)重写OnOK和OnCancle函数,在函数中,调用DestroyWindow()函数

      2)重写PostNcDestroy()函数,在函数中,delete this;

  5、DoModal()函数的执行过程

    5.1查找和加载对话框资源

    5.2将父窗口设置为不可用状态

    5.3创建和显示对话框

    5.4进入对话框的消息循环

    5.5点击OK/Cancel/关闭按钮时,跳出循环,隐藏对话框窗口

    5.6将父窗口设置为可用的和活动的状态

    5.7销毁对话框窗口

    5.8释放对话框资源

    5.9函数执行结束,得到DoModal函数的返回值

二、对话框上的控件操作

  对话框的初始化函数:CDialog::OnInitDialog()

  1、方式一:通过调用CWnd::GetDlgItem()函数,根据控件ID获取控件对象指针,操作控件即可。

    CWnd::GetWindowText--获取控件上显示的文本

    CWnd::SetWindowText--设置控件上显示的文本

    CWnd::GetDlgItemText--获取指定ID的控件上的文本,结合了GetDlgItem和GetWindowText的功能

    CWnd::SetDlgItemText--设置指定ID的控件上的文本

  2、方式二:对话框的数据交换技术(DDX)

    将控件和一个对话框类的成员变量绑定,可以通过操作成员变量达到操作控件的目的。

    1)定义与控件绑定的成员变量

      

    2)在对话框类的头文件中会自动增加成员变量的声明;在对话框类的构造函数中会对成员变量初始化;在对话框类的DoDataExchange函数中会自动实现对话框控件与类成员变量的绑定关联    

// Dialog Data
    //{{AFX_DATA(CTestDlg)
    enum { IDD = IDD_DIALOG1 };
    int     m_num1;
    int     m_num2;
    int     m_num3;
    //}}AFX_DATA
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTestDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CTestDlg)
    m_num1 = 0;
    m_num2 = 0;
    m_num3 = 0;
    //}}AFX_DATA_INIT
    m_bIsCreated=FALSE;
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTestDlg)
    DDX_Text(pDX, IDC_EDIT1, m_num1);
    DDX_Text(pDX, IDC_EDIT2, m_num2);
    DDX_Text(pDX, IDC_EDIT3, m_num3);
    //}}AFX_DATA_MAP
}

      DDX_Control()  //控件类型的绑定

      DDX_Text()  //值类型的绑定

      DDX_:对话框数据交换函数

      DDV_:对话框数据校验函数

    3)通过成员变量完成对控件的操作

    4)值类型的绑定,还需调用UpdateData(BOOL)函数

      UpdateData(TRUE); -将控件中的值赋值给变量

      ......//对成员变量的操作

      UpdateData(FALSE); -将变量的值显示到控件上

    5)DDX的实现原理

      1--控件类型的绑定

      DDX_Control(pDX,IDOK,m_wndOK){

        //通过控件ID得到控件句柄

        HWND hWndCtrl = pDX->PrepareCtrl(nIDC);

        //将控件句柄与变量绑定

        rControl.SubclassWindow(hWndCtrl){

          Attach(hWnd){

            pMap->SetPermanent(m_hWnd = hWndNew, this){

              //以句柄为键,以变量地址为值建立映射关系

              m_permanentMap[(LPVOID)h] = permOb;

            }

          }

        }

      }

      2--值类型的绑定

      UpdateData(FALSE){

        CDataExchange dx(this, bSaveAndValidate);

        DoDataExchange(&dx){

          DDX_Text(pDX,IDC_EDIT1,m_strEdit){

            //通过控件ID得到控件句柄

            HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);

            if (pDX->m_bSaveAndValidate){

              int nLen = ::GetWindowTextLength(hWndCtrl);

              ::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);

              value.ReleaseBuffer();

            }else{

              //将变量的值设置到控件的窗口上

              AfxSetWindowText(hWndCtrl, value);

            }

          }

        }

      }

  

  例子1:使用DDX完成登录的验证

  例子2:采用两种不同的方式实现加法器

 

posted @ 2017-05-29 19:17  Autumn_n  阅读(421)  评论(0编辑  收藏  举报
TOP