转自:https://blog.csdn.net/shuilan0066/article/details/5775383
查了很多资料,都说DoModal()返回值为OK或CANCEL键的ID, 其实,这种说法是错误的,只不过是因为大部分关闭方法是通过OK与CANCLE关闭的
MSDN是这样说明其返回值的
If successful, the value of the nRetCode parameter 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)设定自定义的关闭方式
![](/qrcode.jpg)
如下例子:
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);
}