在模态对话框中:
正常的用户触发的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函数终止消息循环,所以进程无法正常退出,被系统挂起。
参考链接:
https://blog.csdn.net/yangyihongyangjiying/java/article/details/44488343