对话框类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:采用两种不同的方式实现加法器

时间: 2024-08-05 11:06:25

对话框类CDialog的相关文章

mfc 在VC的两个对话框类中传递参数的三种方法

弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMDDDlg类.在主对话框上我放置了一个标签页(Tab Control)控件,其实现的功能是当单击标签提示A时进入页面A,即对话框A(所对应的类为CDialogChild1),单击B时进入对话框B(CDialogChild2). 整个工程的框架已经设计好了,在对话框A和对话框B上放置了许多控件,现在我想

【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++6.0

VS2010/MFC对话框:创建对话框类和添加控件变量

创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的.大家用过VC++ 6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDia

CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习

CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: 1 void CTXTDlg::OnFileSaveas() 2 { 3 LPCTSTR szFilter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"; //过滤器设置,注意格式 4 CFileDialog fd(FALSE,"txt",NULL,OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST| /

多文档中建立一个对话框类,通过这个方法来在其他类中得到对话框对象指针,访问对话框成员

{ // 添加内容 m_pDrawTool = new CDrawToolDlg; m_pDrawTool->Create(IDD_DRAWTOOLS, this); m_pDrawTool->ShowWindow(SW_SHOW); // 让窗口出现在屏幕右下方 CRect dlgRect; CRect mainRect; m_pDrawTool->GetClientRect(&dlgRect); GetWindowRect(mainRect); // 计算显示的坐标 int

MFC技术积累——基于MFC对话框类的那些事儿

1. 创建对话框类 (1)打开VC++6.0环境,点击:文件→新建: (2)在弹出的新建对话框中选择:工程→MFC AppWizard (exe)→输入工程名称(例如:功能调试)→工程保存路径名→确定(其他勾选项一律默认): (3)在弹出的MFC AppWizard- Step1对话框中选择:(你喜爱创建的应用程序类型?)点击基本对话框→(使用语言?)选择中文→点击下一个: (4)在弹出的MFC AppWizard- Step2 of 4对话框中选择:这里基本保持默认选择,比较有用的一项是输入标

ListCtrl添加右键菜单(在对话框类中)

在对话框类中如何添加NM_RCLICK消息: ListCtrl控件右键单击选择属性 在右侧属性栏中选择控件事件 在控件事件中找到NM_RCLICK并添加 完成,写代码

MFC 调用默认对话框类对象成员和方法

这个功能其实并不常用,然而在多线程和回调函数中要调用默认对话框类的对象成员或方法还是可能要用到的,所以做下记录. 首先声明一个全局变量用以存储默认对话框类对象指针: LPVOID pParam;//对话框对象指针 在默认对话框类的初始化函数中给该指针进行赋值: pParam = (void *)this; 在需要调用默认对话框类对象成员或方法处,通过如下代码实现调用: CPanoramicPlayerDlg *dlg = (CPanoramicPlayerDlg *)lpParam;//其中CP

VC++对话框(CDialog)添加背景图片

在对话框(CDialog)程序中,为了让程序看上去漂亮一些,我们可以为对话框添加一个好看的背景图片,要想完成这个目标,可以利用afx_msg BOOLOnEraseBkgnd (CDC* pDC) 这个函数. 下面结合实例说明(实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8337225): (1)找来一张合适的BMP格式的背景图片,将其放在工程的res目录下,然后在程序的资源视图中,将这张图片导入进来(假设导入后其ID为: