MFC 模态对话框dlg.DoModal()返回值

出处: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)设定自定义的关闭方式

 

如下例子:

 

[c-sharp]  view plain copy
  1. void EndDialog(  
  2.    int nResult   
  3. );  
  4.   
  5. Parameters  
  6.   
  7. nResult  
  8.   
  9.     Contains the value to be returned from the dialog box to the caller of DoModal.  
  10.   
  11.  Remarks  
  12.   
  13. 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.  
  14.   
  15. 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.  
  16.   
  17. 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.  
  18.   
  19.   
  20.   
  21.   
  22.   
  23.  Example  
  24.   
  25. /* MyWnd.cpp */  
  26. #include "MyDialog.h"  
  27.   
  28. void CMyWnd::ShowDialog()  
  29. {  
  30.    CMyDialog myDlg;  
  31.    int nRet = myDlg.DoModal();  
  32.   
  33.    if ( nRet == IDOK || nRet == 5  )  
  34.       AfxMessageBox("Dialog closed successfully");  
  35. }  
  36.   
  37. /* MyDialog.cpp */  
  38. void CMyDialog::OnSomeAction()  
  39. {  
  40.    // Do something  
  41.   
  42.    int nRet = 5; // Just any value would do!  
  43.    EndDialog(nRet); // This value is returned by DoModal!  
  44.   
  45.    // Do something  
  46.   
  47.    return// Dialog closed and DoModal returns only here!  
  48. }  

 

 

 

 

在工程中遇到这样的问题

 

一个模态对话框 有三个按钮

 

分别是ONOK()   ONCANCEL() EndDialog(0XFF)

 

   

但是发现 当按模态对话框右上角的叉号关闭对话框时

 

总是跳到ONCANCEL()关闭对话框时相同的处理方法

 

推断:   点击叉后 它默认也是ONCANCEL关闭窗口

 

 

解决方法:  因为叉响应WM_COLOSE消息 因此为它创建一个关闭方式

 

 

[c-sharp]  view plain copy
  1. void WeiKuangKe::OnClose()  
  2. {  
  3.     // TODO: Add your message handler code here and/or call default     
  4.       
  5.         int nRet=5;  
  6.         EndDialog(nRet);  
  7.   
  8. }  

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值