zoukankan      html  css  js  c++  java
  • 对话框类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:采用两种不同的方式实现加法器

  • 相关阅读:
    学习使用Markdown
    开发落网电台windows phone 8应用的计划(10)-----收尾
    MyEclipse10安装SVN插件
    HBuilder连接码云
    sqlserver2004数据库备份,在sqlserver2008还原
    fiddler抓包时出现了tunnel to ......443
    Fiddler抓取Android真机上的HTTPS包
    Fiddler证书安装(查看HTTPS)
    Mac安装普元移动开发平台Primeton Mobile_7.2LA
    Mac下安装MySQL、Workbench以及建数据库建表最基础操作
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/6918792.html
Copyright © 2011-2022 走看看