我用CreateWindow建立一个窗口,
但关闭窗口时消息循环收不到关闭窗口消息,
以下代码在我按下关闭窗口按钮时,
窗口是关闭了,
程序却没退出,
请高手帮忙啊.#include "stdafx.h"
HWND hm;
HINSTANCE hi;ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); 
wcex.style = CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)DefWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = 0;
wcex.lpszClassName = "w";
wcex.hIconSm = 0;
return RegisterClassEx(&wcex);
}
void Swnd(){
hm=CreateWindow("w","aaaaaaa",WS_OVERLAPPEDWINDOW,0,0,400,400,NULL, NULL, hi, NULL);
ShowWindow(hm,SW_SHOW);
UpdateWindow(hm);
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
BYTE u;MSG mg;UINT m;
hi=hInstance;
MyRegisterClass(hInstance);
Swnd();
while(GetAsyncKeyState(27)==0){
u=PeekMessage(&mg,hm,0,0xffff,PM_REMOVE);
if(u){
m=mg.message;
if(m==WM_QUIT)break;
if(m==WM_CLOSE)break;
if(m==WM_DESTROY)break;
if(hm==0)break;
DispatchMessage(&mg);
}
}
return 0;
}

解决方案 »

  1.   

    你记住,关闭窗口和程序是不同的
    窗口是用create和destroy来生成和销毁的,但程序是你的所编的
    程序的结束,一个是系统级的,一个是语言级的,窗口随时可关。
    而当程序执行到return 0才算结束了这个进程。
      

  2.   

    WM_CLOSE, WM_SIZE这样的消息在PeekMessage里面是截获不了的,不知道什么原因,要高手来答~~~但是window的lpfnWndProc函数中可以接收到这样的消息:所以你的程序中:
    wcex.lpfnWndProc = (WNDPROC)DefWindowProc;
    这里不要用缺省得函数,要自己定义~~
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM w, LPARAM l)
    {
    switch(msg)
    {
    case WM_CLOSE:
    PostQuitMessage(0);
    break;
    }
    return DefWindowProc(hWnd, msg, w, l);
    }
    接收到WM_CLOSE,发送WM_QUIT消息,要不然是没有WM_QUIT消息的。。
    while(GetAsyncKeyState(27)==0){
    u=PeekMessage(&mg,hm,0,0xffff,PM_REMOVE);
    if(u){
    m=mg.message;
    if(m==WM_QUIT)break;
    if(m==WM_CLOSE)break;
    if(m==WM_DESTROY)break;
    if(hm==0)break;
    DispatchMessage(&mg);
    }
    }这里PeekMessage(&mg,hm,0,0xffff,PM_REMOVE);里面的hm改为NULL, peek所有消息。
    只要if(m==WM_QUIT)break;就可以了
      

  3.   

    if(m==WM_DESTROY)PostQuitMessage(0);
    这样可以吗?