持之以恒
分类: WINDOWS
2009-07-25 10:31:07
对话框的学习
分成两种模态和非模态
模态对话框的创建
创建一个对话框模板
构造一个CDialog对象,并封装该对话框的模板
调用CDialog::DoModal显示对话框
WM_CREATE
创建对话框内的相应的控件,以便进行初始化
WM_INITDIALOG OnInitDialog()
初始化相应的控件
设置焦点:SetFocus(),一般是这样调用的GetDlgItem(int nID)->SetFoucs()
关于DoModal的返回值的利用的问题:
默认的情况下,DoModal的返回值只有两个就是IDOK和IDCANCEL,可以编写自己的对话框类返回其他的值
EndDialog(ReturnValue);
对话框的数据交换和数据校验
建立相关控件和成员变量的映射表DDX
DDV数据校验机制
无模式对话框
两者之间的主要的区别:
显示模态对话框需要调用DoModal(清除的时候进行返回),而显示无模态对话框则需要调用CDilalog::Create(创建后就要进行返回)
清除非模态对话框要调用DestoryWindow而不是调用EndDialog,禁止对非模态对话框调用CDialog::OnOK或者是CDialog::OnCancel(),因为两者都调用EndDialog()
模态对话框是在栈上进行相应的初始化,所以进行自动的析构,非模态对话框通过new来进行创建,所以该对话框不会被过早的清除。
删除非模态对话框对象的一种方法是在在派生的对话框中覆盖CDialog::PostNcDestory,并执行Delete this;语句
1. new Dialog
2. 设定相应的参数
3. 调用相应的Create方法
4. 调用ShowWindow(SW_)
UpdateData(TRUE)函数
关于OnCommand(WPARAM wParam,LPARAM lParam);
此函数完成了对菜单、通告消息或加速键的响应处理
在菜单或工具条上按下某项,(或按了对应的热键)将向窗口发送一个WM_COMMAND消息
为什么要提这个功能,因为在指定命令的响应函数时,是具体到某一个类中,比如在view类中增加一个对菜单项的响应函数,此时某个菜单项的响应和处理就是在view类的范围中进行处理的。
在消息的路由中,只要中view类的上层中没有处理相应菜单项的函数,就会默认路由到view中,所以这就有了OnCommand这个函数的需求。可以在view类的上层进行动态的处理。
它是命令响应函数。在32位系统中 lParam 中存在的是句柄 HWND hwnd=(HWND)lParam;
wParam 中低位是命令ID 高位是代码,
UINT
ID=HIWORD(wParam);
int
code=LOWORD(wParam);
如果是加速键code=1 其他的code=0
关于OnCommand()和OnCmdMsg()
首先,OnCommand()是在CWnd类中的,而OnCmdMsg()是在CCmdTarget类中的。你如果看了MFC的类的继承图的话,你就会知道CWnd是从CCmdTarget类中继承的。
OnCommand()主要是用来处理消息(控件,菜单,加速键)的;而OnCmdMsg( )主要是用来处理消息的路由的。