查了很多资料,都说DoModal()返回值为OK或CANCEL键的ID
其实,这种说法是错误的
MSDN是这样说明其返回值的
If successful, the value of thenRetCodeparameter specified in the call toEndDialog;
otherwise, -1.
如果操作成功,其返回值为由EndDialog指定的nRetCode的值,而此参数nRetCode的含义为关闭对话框所采用的方式
也就是说,在关闭此模态对话框时,其返回值为关闭对话框时所采用的方式
因此它只在对话框关闭时才返回相关参数值
默认对话框关闭方式有2种:OnOK(); OnCancel()
当使用OnOK()函数关闭对话框时,返回值为IDOK
当使用OnCancel()函数关闭对话框时,返回值为IDCANCEL
返回值与ID无关
比如一个按钮的ID为IDC_BUTTON1
在此按钮的处理函数中添加关闭对话框方式: OnOk()
则 点击此按钮时,对话框返回值为IDOK
除此两种默认关闭方式外,还可用EndDialog(int nRetCode)设定自定义的关闭方式
如下例子:
void EndDialog(
int nResult
);
Parameters
nResult
Contains the value to be returned from the dialog box to the caller of DoModal.
Remarks
This member function returns nResult as the return value of DoModal. You must use the EndDialog function to complete processing whenever a modal dialog box is created.
You can call EndDialog at any time, even in OnInitDialog, in which case you should close the dialog box before it is shown or before the input focus is set.
EndDialog does not close the dialog box immediately. Instead, it sets a flag that directs the dialog box to close as soon as the current message handler returns.
Example
/* MyWnd.cpp */
#include "MyDialog.h"
void CMyWnd::ShowDialog()
{
CMyDialog myDlg;
int nRet = myDlg.DoModal();
if ( nRet == IDOK || nRet == 5 )
AfxMessageBox("Dialog closed successfully");
}
/* MyDialog.cpp */
void CMyDialog::OnSomeAction()
{
// Do something
int nRet = 5; // Just any value would do!
EndDialog(nRet); // This value is returned by DoModal!
// Do something
return; // Dialog closed and DoModal returns only here!
}
在工程中遇到这样的问题
一个模态对话框 有三个按钮
分别是ONOK() ONCANCEL() EndDialog(0XFF)
但是发现 当按模态对话框右上角的叉号关闭对话框时
总是跳到ONCANCEL()关闭对话框时相同的处理方法
推断: 点击叉后 它默认也是ONCANCEL关闭窗口
解决方法: 因为叉响应WM_COLOSE消息 因此为它创建一个关闭方式
void WeiKuangKe::OnClose()
{
// TODO: Add your message handler code here and/or call default
int nRet=5;
EndDialog(nRet);
}
分享到:
相关推荐
此程序目的主要演示父子窗体的调用,另外演示按钮事件驱动向文本框里面填写文本 ,此程序主要参考http://blog.csdn.net/kingsollyu/article/details/8312910
不基于MFC的窗口调用程序。支持VC++6.0
代码如下:#include<afxwin>//包含MFC头文件//从MFC的主要框架窗体派生用户窗体类class CMyWnd:public CFrameWnd{public: CMyWnd(LPCTSTR szTitle) { //调用父类Create函数创建窗体 Create(NULL,szTitle);...
用取巧的方式将vtk的窗体嵌入MFC窗体中,所以如果电脑非常卡的时候,在MFC窗体启动的时候可能会看到一个黑窗闪过,是正常现象。 第三步的动作,不要在回调或者线程中调用,请用变量的办法如内存共享,全局变量,发...
我想利用本月的专栏描述一个有趣...RegexForm 是一个基于正则表达式的MFC窗体有效性验证系统。为了实现这个程序,我首先实现了 RegexWrap。但因为许多细节与正则表达式本身无关,所以感觉在这里描述 RegexForm 更好些。
vc编程:自动停靠窗体,吸附窗体,类似千千静听的窗体
FAQ吧。经常有人问如何关闭当前窗体打开新窗体。我想,需要调用Application.Run,之前是新创建线程。但现在发现这样做更好。程序几乎不用怎么改了
该资源里面有一个可以实现点击一个窗口弹出另一个窗口的实例,还有一个本人在解决这个问题时所做的笔记。你们可对比实例和我的笔记来参考。
名称:MFC窗口创建(非向导) 环境:Win7 x64,VS2015 内容:使用VS2015创建Win32程序项目,然后调用MFC文件 学习来源:参考于 黑马程序员MFC教程
在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等。矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使用足矣...
本例程主要包含MFC较为常用的一些控件的自绘继承类,自绘全都为自定义类,直接调用即可。都是些较为简单的自绘,可供初学者学习。
在子窗口中调用父窗口的成员函数的方法 1、用FindWindow("类名(可以是派生类)","窗口标题")或GetParent(),二者均能返回父窗口句柄,并能直接使用其成员函数。但是此法只能调用CWnd类里的成员...
6.1 实例15:创建标签窗体视 143 6.2 实例16:创建具有通用控件的视 150 6.3 实例17 :打印报表 156 6.4 实例18: 打印视 167 6.5 实例19:绘制MDI客户视 174 6.6 实例20:拖放文件到视 177 第7章 对话框和对话条 ...
6.1 实例15:创建标签窗体视 143 6.2 实例16:创建具有通用控件的视 150 6.3 实例17 :打印报表 156 6.4 实例18: 打印视 167 6.5 实例19:绘制MDI客户视 174 6.6 实例20:拖放文件到视 177 第7章 对话框和对话条 ...
将一个第三方应用窗口嵌入自己的程序窗口, 需要被嵌入应用窗口为目标窗口,承载嵌入应用窗口为宿主窗口,目标窗口为任意第三方应用。
在MFC中,C++语言在一个dll中调用另一个dll
代码说明:闲来无事整理SDI(单文档)界面, 供大家探讨,有不足或错误处,望大家谅解 编译环境: ...从而可以调用和设置对应 view 的函数和属性值 0,代码没有任何第三方组件或dll(所谓开源吗,嘿嘿)
6.1 实例15:创建标签窗体视 143 6.2 实例16:创建具有通用控件的视 150 6.3 实例17 :打印报表 156 6.4 实例18: 打印视 167 6.5 实例19:绘制MDI客户视 174 6.6 实例20:拖放文件到视 177 第7章 对话框和对话条 ...
6.1 实例15:创建标签窗体视 143 6.2 实例16:创建具有通用控件的视 150 6.3 实例17 :打印报表 156 6.4 实例18: 打印视 167 6.5 实例19:绘制MDI客户视 174 6.6 实例20:拖放文件到视 177 第7章 对话框和...