EndDialog和CDialog::OnOK()
来源:互联网 发布:mac ubuntu 编辑:程序博客网 时间:2024/06/01 09:35
第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数。从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。
第二,OnClose()和OnDestroy()
在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。
第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()
CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;
CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;
OnClose()是响应 WM_CLOSE 的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。
CDialog::EndDialog()-------->OnDestroy()
OnClose()-------->OnDestroy()
EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,但两种机制都必须经过OnDestroy()
然后发现
下面这两种说法不明晰
(1) EndDialog(-1);
关闭模态对话框,并且将参数作为父对话框调用的返回值。
(2) DestroyWindow(); ::PostQuitMessage(0);
DestroyWindow 关闭非模态对话框。 退出消息循环,真正结束进程。有不少程序窗口关闭,但是不等于退出运行。
cDialog::onok(),enddialog(),destroywindow区别。 收藏
模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。
最后三个还不错
Windows API一日一练(18)EndDialog函数 收藏
上一次介绍了怎么样显示对话框的函数,那么怎么样关闭对话框呢?这就需要使用到函数EndDialog。这个函数只能在对话框的消息处理函数里使用,并且这个函数调用之后,没有立即就删除对话框的,而是设置了操作系统里的结束标志。当操作系统查检到有这个标志时,就去删除对话框的消息循环,同时也去释放对话框占用的资源。其实对话框的生命周期是这样的,先由函数DialogBox创建对话框,这样函数DialogBox完成创建对话框但还没有显示前会发出消息WM_INITDIALOG,让对话框有机会初始化上面所有窗口或控件的显示,比如设置文本框的字符串等。最后当用户点出确定或者取消的按钮,就收到两个命令IDOK或IDCANCEL,这时就可以调用函数EndDialog来结束对话框的生命。
函数EndDialog声明如下:
WINUSERAPI
BOOL
WINAPI
EndDialog(
__in HWND hDlg,
__in INT_PTR nResult);
hDlg是对话框窗口的句柄。
nResult是设置给函数DialogBox的返回值。
调用这个函数的例子如下:
#001 // 显示关于对话框。
#002 //
#003 // 蔡军生 2007/07/12
#004 //
#005 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
#006 {
#007 UNREFERENCED_PARAMETER(lParam);
#008 switch (message)
#009 {
#010 case WM_INITDIALOG:
#011 return (INT_PTR)TRUE;
#012
#013 case WM_COMMAND:
#014 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
#015 {
#016 EndDialog(hDlg, LOWORD(wParam));
#017 return (INT_PTR)TRUE;
#018 }
#019 break;
#020 }
#021 return (INT_PTR)FALSE;
#022 }
第16行就是调用函数EndDialog来关闭对话框。
第二,OnClose()和OnDestroy()
在单视图程序中,根据<<深入浅出MFC>>所讲,程序退出时执行的操作顺序为(从点X按钮开始)
(1)用户点击X退出按钮,发送了WM_CLOSE消息----->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()----->销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----->窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。
第三,OnOK()、OnCancel()()、OnClose()、OnDestroy()
CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;
CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;
OnClose()是响应 WM_CLOSE 的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。
CDialog::EndDialog()-------->OnDestroy()
OnClose()-------->OnDestroy()
EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,但两种机制都必须经过OnDestroy()
然后发现
下面这两种说法不明晰
(1) EndDialog(-1);
关闭模态对话框,并且将参数作为父对话框调用的返回值。
(2) DestroyWindow(); ::PostQuitMessage(0);
DestroyWindow 关闭非模态对话框。 退出消息循环,真正结束进程。有不少程序窗口关闭,但是不等于退出运行。
cDialog::onok(),enddialog(),destroywindow区别。 收藏
模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。
最后三个还不错
Windows API一日一练(18)EndDialog函数 收藏
上一次介绍了怎么样显示对话框的函数,那么怎么样关闭对话框呢?这就需要使用到函数EndDialog。这个函数只能在对话框的消息处理函数里使用,并且这个函数调用之后,没有立即就删除对话框的,而是设置了操作系统里的结束标志。当操作系统查检到有这个标志时,就去删除对话框的消息循环,同时也去释放对话框占用的资源。其实对话框的生命周期是这样的,先由函数DialogBox创建对话框,这样函数DialogBox完成创建对话框但还没有显示前会发出消息WM_INITDIALOG,让对话框有机会初始化上面所有窗口或控件的显示,比如设置文本框的字符串等。最后当用户点出确定或者取消的按钮,就收到两个命令IDOK或IDCANCEL,这时就可以调用函数EndDialog来结束对话框的生命。
函数EndDialog声明如下:
WINUSERAPI
BOOL
WINAPI
EndDialog(
__in HWND hDlg,
__in INT_PTR nResult);
hDlg是对话框窗口的句柄。
nResult是设置给函数DialogBox的返回值。
调用这个函数的例子如下:
#001 // 显示关于对话框。
#002 //
#003 // 蔡军生 2007/07/12
#004 //
#005 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
#006 {
#007 UNREFERENCED_PARAMETER(lParam);
#008 switch (message)
#009 {
#010 case WM_INITDIALOG:
#011 return (INT_PTR)TRUE;
#012
#013 case WM_COMMAND:
#014 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
#015 {
#016 EndDialog(hDlg, LOWORD(wParam));
#017 return (INT_PTR)TRUE;
#018 }
#019 break;
#020 }
#021 return (INT_PTR)FALSE;
#022 }
第16行就是调用函数EndDialog来关闭对话框。
阅读全文
0 0
- EndDialog和CDialog::OnOK()
- EndDialog和CDialog::OnOK()
- EndDialog和CDialog::OnOK();
- EndDialog和CDialog::OnOK()
- CDialog::OnOk()作用
- 关于CDialog类的OnOK、OnCancel、OnClose和OnDestroy
- cdialog::onclose(); 和 cdialog::onok();还有 showwindow(SW_HIDE);的具体区别
- CDialog OnOK OnCancel的区别
- CDialog的派生类中OnOK()函数和virtual的关系
- CDialog dlg; 和 CDialog *pDlg;的区别
- WM_CLOSE WM_QUIT 和 WM_DESTROY EndDialog的区别
- MFC CDialog类:多线程OnOk()关闭对话框 与 初始化隐藏对话框的问题
- CDialog
- CDialog
- CDialog
- 对话框和对话框类CDialog
- 对话框和对话框类CDialog
- EndDialog函数
- Mysql 多表查询详解
- ffmpeg 静态库使用,undefined reference错误
- MySQL日志文件之错误日志和慢查询日志详解
- 最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用
- 勇者斗恶龙UVa 11292
- EndDialog和CDialog::OnOK()
- Linux 文件目录特殊权限设定(SUID,SGID,SBIT)
- 8.15 E
- ubuntu 16.04 ROS + kinect v2 driver安装方法;安装驱动时遇到的问题及解决方法(1)
- Java实现九九乘法表
- TableView 实现单项选择题
- 获取屏幕的宽高和密度
- Lua写脚本、自带常用函数、写自定义库函数
- html表单验证