标签:原理 替换 3.3 null date 建立 实现 property oda
一、对话框资源
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:采用两种不同的方式实现加法器
标签:原理 替换 3.3 null date 建立 实现 property oda
原文地址:http://www.cnblogs.com/zhouwanqiu/p/6918792.html