`
dqifa
  • 浏览: 112246 次
社区版块
存档分类
最新评论

wxWidgets框架下基于wxDialog程序的标准退出方法

 
阅读更多

退出程序的标准方法是什么呢?我觉得所谓的标准方法,是要使程序能够做一些清理工作,而不是暴力退出,从而引起内存泄露和资源泄露。
那么现在我们要用wxDec-C++创建一个基于wxDialog的程序,为了验证程序是否标准退出,那么我们要在wxAPP对象的OnExit()事件中写上一个MessageBox,用来代表清理代码。
int test1DlgApp::OnExit()
{
    MessageBox(0,"OnExit","OnExit",MB_OK);
    return 0;
}

同样的,我们也应该在主窗口的OnClose事件中写上一个MessageBox,代表清理代码:
void test1Dlg::OnClose(wxCloseEvent& /*event*/)
{
    MessageBox(0,"OnClose","OnClose",MB_OK);
    Destroy();
}

好,按么现在在主窗体上放上一个按钮,然后编写按钮的click事件的处理代码:
/*
 * WxButton1Click
 */
void test1Dlg::WxButton1Click(wxCommandEvent& event)
{
    // insert your code here
    //ExitProcess(0);
    // this->EndModal(true);
    ::PostMessage((HWND__ *)this->GetHandle(),WM_CLOSE,0,0);
    //::PostMessage((HWND__ *)this->GetHandle(),WM_QUIT,0,0);
    //exit(0);
}
这里展现了五种退出程序的方法,但是仅仅有一种能够同时引发OnClose和OnExit事件,那就是:
   ::PostMessage((HWND__ *)this->GetHandle(),WM_CLOSE,0,0);

 这两种方法:ExitProcess(0);exit(0);都是强制结束了程序,没有引发OnClose和OnExit事件;
而方法:this->EndModal(true);则仅仅是隐藏了窗口,并没有使程序退出;
方法:::PostMessage((HWND__ *)this->GetHandle(),WM_QUIT,0,0);则仅仅引发了OnExit事件,却没有引发OnClose事件。发送WM_QUIT消息和发送WM_CLOSE消息的区别是什么呢?为什么会引起截然不同的效果,我上网查找资料找到了答案:
“WM_CLOSE发给窗口或线程/进程通知关闭窗口或退出线程/进程。 
 你可以处理WM_CLOSE消息。 
  WM_QUIT通知退出线程/进程,你不能处理WM_QUIT消息,因为它使GetMessage返回0,从而使线程/进程退出。”
原来区别就在于,WM_QUIT使GetMessage函数返回0,而windows应用程序的消息循环是一个while循环,GetMessage返回为真才会继续循环下去,如果返回0,会直接结束while循环。而WM_CLOSE消息就不同了,它会使消息循环先处理WM_CLOSE消息,这样就可以引发OnClose()事件了,因为OnClose函数就是WM_CLOSE消息的响应函数。


from:http://blog.csdn.net/qiqi5521/article/details/2306816

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics