mfc关闭模态dialog的正确方式

在模态对话框中:

正常的用户触发的OnOK 、OnCancel消息都是通过调用函数EndDialog去关闭模态对话框的,EndDialog函数并不立即清除对话框。而是设置一个标志,并且允许对话框应用程序把控制权返回系统。系统在试图从应用程序队列检索下一个消息之前检测标志。如果已经设置了标志则系统中止消息循环,清除对话框,所以当我们想在代码中去调用EndDialog函数去结束对话框,最后再释放对话框对象。

函数原型:BOOL EndDialog(HWND hDlg,int nResult); 
  参数: 
  hDlg:表示要被清除的对话框窗口。 
  NResult:指定从创建对话框函数返回到应用程序的值。 
  返回值:如果函数调用成功,则返回值为非零值;如果函数调用失败则返回值为零。若想获得错误信息请调用GetLastError函数


EndDialog 与 DestroyWindow 的区别
(1) EndDialog(-1);

关闭模态对话框,并且将参数作为父对话框调用的返回值。

(2)  DestroyWindow();  ::PostQuitMessage(0);

DestroyWindow 关闭非模态对话框。 退出消息循环,真正结束进程。有不少程序窗口关闭,但是不等于退出运行。CDialog::EndDialog

void EndDialog(int nResult);

参数:

nResult 对话框返回的值,用于调用者DoModal。
说明:

调用该成员函数来中止一个模态对话框。该函数返回nResult。无论模态对话框是何时被创建的,必须使用EndDialog来结束处理。

可以随时调用EndDialog,即使在使用OnInitDialog时,即在对话框显示或获得输入焦点之前就关闭它。

EndDialog不会立即关闭对话框。它设置了一个标记,用以指定在当前消息处理程序返回时就关闭对话框。


PS:今天遇到的问题:由于在模态对话框中调用了其他结束函数,没有调用EndDialog函数终止消息循环,所以进程无法正常退出,被系统挂起。



展开阅读全文

没有更多推荐了,返回首页