当响应WM_CLOSE的时候,调用DestroyWindow。
而DestroyWindow内部调用SendMessage(hWnd, WM_DESTROY, 0, 0)。响应WM_DESTOY的时候,调用PostQuitMessage(0)。
按理说,这时候程序应该退出了。但我发现会再次收到WM_DESTROY !!大家可以用一个static int iDestroyTimes = 0 试一下,在WM_DESTOY的时候,iDestroyTimes++。我试过了,iDestroyTimes = 2。
用VC默认生成的SDK的模板程序就可以。不解,求救。

解决方案 »

  1.   

    我用的是SDK。
    LRESULT CALLBACK WndProc(....)
    {
        static int iDestroyTimes = 0;
        ......
        case WM_CLOSE: 
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY: 
            iDestroyTimes++;
            PostQuitMessage(0);
            return 0; 
        ......
    }退出程序用的是点击右上角的叉子按钮。
    这时会激发WM_SYSCOMMAND消息——〉激发WM_CLOSE——〉调用DestroyWindow,并激发WM_DESTROY——〉响应WM_DESTROY,并调用PostQuitMessage(0)。而后就是一段汇编,看不懂。
    接着又是WM_DESTROY。
    另外,我又试了一种方法:
      在菜单响应中调用DestroyWindow,不是系统菜单,使用户菜单。这样就调用WM_DESTROY一次。  因此我猜测是系统的WM_CLOSE处理中调用了SendMessage(hWnd, WM_DESTROY, 0, 0),因此和我的DestroyWindow 一共激发了2个WM_DESTROY。这种方式我想和 reviver(reviver)所说的差不多。只是MFC封装了底层的消息流转,但原理是一样的。