zoukankan      html  css  js  c++  java
  • Windows中点击“关闭”button发生了什么?

         对于Windows操作,当用户点击"关闭"button时,窗体函数就会收到一个WM_DESTROY消息。

        窗体函数应该调用PostQuitMessage(0) 向消息队列插入一个WM_QUIT消息。GetMessage 假设从消息队列中取得的是WM_QUIT消息,它将返回0,从而导致消息循环结束,WinMain函数退出,整个应用程序退出。

         仅仅要通过点击窗体右上角的“关闭”button,来关闭窗体并退出应用程序。能不能在结束应用程序之前弹出一个对话框,来确认一下我们的操作呢?

         要做到这一点,首先要了解单击“关闭”button開始,一直到最后应用程序退出究竟发生了什么。事实上,这是一个非常“复杂”的过程,描写叙述例如以下:

    1)单击窗体右上角的“关闭”button,系统向消息队列插入WM_CLOSE消息;

    2)窗体函数调用DefWindowProc 处理WM_CLOSE消息:调用DestroyWindow() 函数;

    3)窗体关闭,并向消息队列插入WM_DESTROY消息;

    4)窗体函数函数处理WM_DESTROY消息:调用PostQuitMessage 函数,向消息队列插入WM_QUIT消息;

    5)主函数的消息循环中的GetMessage获取WM_QUIT消息返回0,导致消息循环结束,进而WinMain函数结束,再进而整个进程结束

         我们能够从这个过程中看到三个消息:WM_CLOSE、WM_DESTROY、WM_QUIT

         WM_CLOSE代表用户希望结束应用程序;WM_DESTROY代表窗体的关闭;WM_QUIT代表进程的结束。

         如何在结束应用程序之前弹出一个对话框,来确认一下我们的操作呢?能够在WndProc 中加入对WM_CLOSE的消息处理。代码例如以下:

    //窗体函数,用于消息处理
    LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
    	int nSel=0;
    	switch(msg){
    		case WM_CLOSE:
    			nSel=MessageBox(hWnd,L"你真的要退出吗?",szWindowTitle,MB_YESNO|MB_ICONQUESTION);
    			if(nSel==IDYES) DestroyWindow(hWnd);
    			return 0;
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			return 0;
    		default:
    			return DefWindowProc(hWnd,msg,wParam,lParam);
    	}
    }


    效果例如以下:

          

    关于窗体函数与消息处理机制:  http://blog.csdn.net/sanqima/article/details/34427471

                                              http://blog.csdn.net/sanqima/article/details/32179711

  • 相关阅读:
    解读Android 12首个开发者预览版
    Pod创建私有库
    Flutter常用网站
    Flutter常用快捷键
    多个网络请求-并发执行、顺序执行
    小猫爬山问题---贪心算法失效,深度优先搜索优化
    网络基本概念备忘:MAC地址,端口,HTTP状态码
    常见图片文件格式简析
    pdf2xls
    评分卡模型
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4517457.html
Copyright © 2011-2022 走看看