我在看《windows程序设计》的时候,“窗口和消息”那一章节的例子
消息处理的部分如下:
 switch (message)
    {
    case WM_CREATE:
           ......
    case   WM_PAINT:
           ......
    case   WM_DESTROY:
            PostQuitMessage (0) ;
            return 0 ;
    }
  return DefWindowProc (hwnd, message, wParam, lParam) ;最后一行是调用默认的处理函数。
那么我把  case   WM_DESTROY  这部分屏蔽掉应该是没有问题的。
但是我把  case   WM_DESTROY  这部分屏蔽以后,
程序运行后关闭了,但是在进程列表里面还能看见。
也就是窗口关闭了,但是进程还在。
我不太明白,难道默认的函数不结束这个进程么?谢谢

解决方案 »

  1.   

    如果你去掉这个case   WM_DESTROY:那么,就没有执行PostQuitMessage这个API,那么系统就不会收到WM_QUIT这个消息,那么就不会退出消息循环,进程当然不会被关闭,但是窗口已经被关了。
      

  2.   

    你在WinMain中应该有一个消息循环:
    while(GetMessage())
     {  .....
        .....
    }
    这里的GetMessage()就是取得消息队列中的消息的,一般它不会返回FALSE,所以这个循环会一直进行下去。只有在取到WM_QUIT消息时它才返回FALSE,这样循环结束,进程也就会结束了。而WM_QUIT这个消息是调用PostQuitMessage()这个函数才发出的。所以你去掉了WM_DESTROY这句就会造成窗口结束,而进程依然还在的现象。
      

  3.   

    to:wltg2001(红猪)
    你说的我了解,我想知道,对于没有写出来的消息,不是调用了默认的消息处理么。
    那么,WM_DESTROY消息的默认处理函数都作了什么工作?
    难道我们写的程序都要自己写WM_DESTROY消息的处理函数么?怎么又出来了一个WM_QUIT  我只知道WM_DESTROY 和WM_CLOSE
    那正确的顺序又是什么样的呢?
      

  4.   

    我不很肯定,因为编程的时间还不长,应该WM_CLOSE在WM_DESTROY前
    应该关闭在销毁的前面
    说错了,别扔砖头,一块讨论,一快学习吗
      

  5.   

    我觉得也是WM_CLOSE在WM_DESTROY前那是不是  WM_CLOSE->WM_DESTROY->WM_QUIT  
    这个顺序呢?谁来确认一下。我就是想知道,这3个消息的默认处理,不是按这个顺序么?
    难道这个顺序是程序员自己来控制的?怎么想都觉得默认的应该可以完成。
      

  6.   

    Destroying a Window
    You can use the DestroyWindow function to destroy a window. Typically, an application sends the WM_CLOSE message before destroying a window, giving the window the opportunity to prompt the user for confirmation before the window is destroyed. A window that includes a window menu automatically receives the WM_CLOSE message when the user clicks Close from the window menu. If the user confirms that the window should be destroyed, the application calls DestroyWindow. The system sends the WM_DESTROY message to the window after removing it from the screen. In response to WM_DESTROY, the window saves its data and frees any resources it allocated. A main window concludes its processing of WM_DESTROY by calling the PostQuitMessage function to quit the application.
      

  7.   

    wm_destory 时, 窗口已经 销毁了, 包括窗口的 图标,菜单等资源, 但是 进程却没有销毁, postquitmessage 终止主线程, 则进程就销毁了, 管理器中就没有 进程了
      

  8.   

    应该是这样的:当你关闭一个窗口时,系统会发送WM_CLOSE消息给你的程序,默认的消息处理函数会处理这个消息,它销毁窗口,并发出WM_DESTROY消息,默认的处理函数好像并不会处理WM_DESTROY这个消息,你应该自己处理它,这时窗口已经被销毁了,但是消息循环还没有退出,你应该用PostQuitMessage这个API来发送一个WM_QUIT消息,因为GetMessage只有收到这个消息时才会返回假,循环才会结束。进程也才会结束。
      

  9.   

    另外,默认的处理函数不处理WM_DESTROY消息也是有原因的,因为有的程序有不止一个窗口,如果你仅仅想关闭一个窗口的话,默认处理函数如果处理WM_DESTROY时发出WM_QUIT就会结束主函数了。
      

  10.   

    默认的处理函数是不会关闭程序的,case   WM_DESTROY:PostQuitMessage (0) ;里面PostQuitMessage(0);就是让消息循环结束,如果被屏蔽的话,窗口虽然被关闭了,但消息循环还在,进程也在。
      

  11.   

    to:wltg2001(红猪) 
    >另外,默认的处理函数不处理WM_DESTROY消息也是有原因的,因为有的程序有不止一个窗口,如果你
    >仅仅想关闭一个窗口的话,默认处理函数如果处理WM_DESTROY时发出WM_QUIT就会结束主函数了。你的意思我明白了,有一点想让你确认一下。
    是不是 WM_DESTROY消息 就是窗口销毁完成后的一个完成消息?
    也就是说WM_DESTROY消息就是窗口已经完成销毁消息
      

  12.   

    PostQuitMessage (0) ; 是必需的, 但可以放在很多地方,WM_SYSTEMCOMMAND 里的wParam == SC_CLOSE, 也行, 这是点击右上角的 X 产生的消息
      

  13.   

    我想应该是的,WM_DESTROY应该表示窗口已经被销毁了。
      

  14.   

    1.默认函数对WM_CLOSE的处理方式是调用::DestroyWindow,并因而发出WM_DESTROY.
    2.默认的WM_DESTROY处理方式是调用::PostQuitMessage,因此发出WM_QUIT.
    3.CWinApp::Run收到WM_QUIT后会结束其内部之消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数.
    4.最后回到AfxWinMain,执行AfxWinTerm,结束程序.
      

  15.   

    你这是MFC的处理方式,我们讨论的是SDK,在SDK中DefWindowProc对WM_DESTROY消息是不处理的。