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

来源:互联网 发布:5.10沙恩霍斯特数据 编辑:程序博客网 时间:2024/05/16 07:18

  查了很多资料,都说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 plaincopyprint?
  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 plaincopyprint?
  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. }  

 

参考资料:

 

http://technet.microsoft.com/zh-cn/office/wddd3ztw%28VS.80%29.aspx

   

转自:http://blog.csdn.net/shuilan0066/article/details/5775383

原创粉丝点击