出处:http://blog.csdn.net/shuilan0066/article/details/5775383
查了很多资料,都说DoModal()返回值为OK或CANCEL键的ID
其实,这种说法是错误的
MSDN是这样说明其返回值的
If successful, the value of the nRetCode parameter specified in the call to EndDialog; 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);
- }