编程实例1——写文字

来源:互联网 发布:知乎 童话书 编辑:程序博客网 时间:2024/06/12 00:05

代码位于空间代码区:<Windows编程实践1——写文字>

 

发现问题:

      while(GetMessage(&msg, NULL, 0, 0 ))

     {

           TranslateMessage(&msg);

           DispatchMessage(&msg);

     }

    在窗口过程中响应WM_DESTROY消息:

    case WM_DESTROY:

            PostQuitMessage(0);

           return 0;

 

      1、在消息循环时,若传递给GetMessage函数的第二个参数为hwnd, 则在关闭窗口后,后台应用程序进程并未关掉。

        分析:

        <1>PostQuitMessage函数

       函数功能:该函数向系统表明有一个线程有终止请求。通常用来响应WM_DESTROY消息。

       函数原型:void PostQuitMessage(int nExitCode);

       参数:nExitCode :指定应用程序退出代码,此值被用作消息WM_QUIT的wParam参数。

       备注:PostQuitMessage发送一个WM_QUIT给线程的消息队列并立刻返回,此函数向系统表明有一个线程请求在随后的某个时间终止;当线程的消息循环从消息队列中取出WM_QUIT消息后,应当退出消息循环并将控制传回给系统,返回给系统的退出值必须是WM_QUIT消息的wParam参数。

       <2>GetMessage函数

       函数功能:该函数从调用线程的消息队列中接收消息,该函数不接收属于其他线程或应用程序的消息,该函数会一直等待,直到从消息队列中得到一个可利用的消息后才返回。

       函数原型:BOOL GetMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax);

       函数参数:wMsgFilterMin和wMsgFilterMax指定检索的消息的范围;

       返回值:接收到WM_QUIT消息以外的消息,返回非零值;接收到WM_QUIT消息,返回零;出现错误,返回-1

       备注:如果hwnd为NULL,则GetMessage接收属于调用线程窗口的消息,线程消息由函数PostThreadMessage寄送给调用线程,由PostThreadMessage寄送的线程消息,其消息hwnd值为NULL;另外,GetMessae不从消息队列中清除WM_PAINT消息,该消息将保存在消息队列中直到该消息处理完毕。

       <3>、为什么当GetMessage函数的第二个参数是hwnd(先前创建的窗口句柄),应用程序并未真正退出?

          MSDN中解释,WM_QUIT不与窗口相关(WM_QUIT的hwnd应该为NULL),当设置GetMessage的第二个参数为hwnd,就意味着GetMessage函数只接收与hwnd相关的消息,因此它不会接收到WM_QUIT消息,所以虽然应用程序主主窗口关闭了,但是消息循环还在进行,主程序并未退出。

 

延伸思考:

       <1>、为什么会出现主窗口关闭,但是应用程序并未关闭?

        原因:WM_DESTROY 是窗口正在关闭时发出的,也就是说,当窗口过程在响应WM_DESTROY消息时,窗口已经从视觉上被删除了,WM_QUIT消息是结束消息循环让主程序退出,在本次程序中,当GetMessage函数的第二个参数为hwnd, GetMessage不能接收到WM_QUIT消息,所以应用程序并未退出。

       <2>、总结:WM_CLOSE 、WM_DESTROY、WM_QUIT的区别

            

http://blog.csdn.net/xiliang_pan/article/details/7178601

               

 

 

 

0 0
原创粉丝点击