woka

WM_CLOSE 和 WM_DESTORY

MFC程序的死亡相对于初生来说要简单的多,主要是以下几步:    
    1.使用者通过点击File/Close或程序窗口右上角的叉号发出WM_CLOSE消息。    
    2.程序没有设置WM_CLOSE处理程序,交给默认处理程序。    
    3.默认处理函数对于WM_CLOSE的处理方式为调用::DestoryWindow,并因而发出WM_DESTORY消息。    
    4.默认的WM_DESTORY处理方式为调用::PostQuitMessage,发出WM_QUIT。    
    5.CWinApp::Run收到WM_QUIT后结束内部消息循环,并调用ExinInstance函数,它是CWinApp的一个虚拟函数,可以由用户重载。    
    6.最后回到AfxWinMain,执行AfxWinTerm,结束程序。    
  ---------------------------------------------------  
  有时你看到有的程序当点右上角的叉的时候没有关闭程序而是最小化了,就是因为它重载了OnClose,把默认的发送Destory消息给删掉了
但是下面这个程序有什么错误,为什么关掉窗口后程序不能正常结束(窗口关闭,进程没有结束),希望高手帮忙。
#include <windows.h>

LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd){
    HWND hwnd;
    WNDCLASS wndclass;
    MSG msg;
    
char lpszClassName[] = "我的窗口";

    wndclass.lpszClassName 
= lpszClassName;
    wndclass.lpfnWndProc 
= WinProc;
    wndclass.hInstance 
= hInstance;
    wndclass.style 
= 0;
    wndclass.cbClsExtra 
= 0;
    wndclass.cbWndExtra 
= 0;
    wndclass.hbrBackground 
= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor 
= LoadCursor(NULL, IDC_ARROW);
    wndclass.hIcon 
= LoadIcon(NULL, IDI_HAND);
    wndclass.lpszMenuName 
= NULL;

    
if(!RegisterClass(&wndclass)){
        MessageBeep(
0);
        
return FALSE;
    }


    
char lpszTitle[] = "My Window";
    hwnd 
= CreateWindow(
        lpszClassName,
        lpszTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
        );
    ShowWindow(hwnd, nShowCmd);
    UpdateWindow(hwnd);
    
    
while(GetMessage(&msg, hwnd, 00)){
        TranslateMessage(
&msg);
        DispatchMessage(
&msg);
    }

    
return msg.wParam;
}


LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
switch(message){
        
case WM_PAINT:
            HDC hdc;
            hdc 
= GetDC(hwnd);
            TextOut(hdc, 
00"VC++", strlen("VC++"));
            DeleteDC(hdc);
            
break;
        
case WM_DESTROY:
            PostQuitMessage(
0);
            
return 0
        default:
            
return DefWindowProc(hwnd, message, wParam, lParam);
    }

    
return 0;
}

posted on 2009-09-09 20:34 woka 阅读(3261) 评论(4)  编辑 收藏 引用

评论

# re: WM_CLOSE 和 WM_DESTORY 2009-09-10 00:52 shly

改成:GetMessage(&msg, 0, 0, 0)
测试了下 正常退出

以下是只是个人理解,不一定可靠:
PostQuitMessage(0)的消息是发给线程队列然后直接返回。
GetMessage(&msg, hwnd, 0, 0)获取hwnd的窗口消息,
GetMessage(&msg, 0, 0, 0)获取所有该线程拥有窗口的消息和线程消息。

所以你的窗口正常摧毁,WM_QUIT却无法被获取,造成了死循环,无法退出。

  回复  更多评论   

# re: WM_CLOSE 和 WM_DESTORY 2009-09-10 20:47 woka

@shly
非常感谢,的确应该改为0(NULL),我刚学vc,你看过什么好书吗,推荐一下,谢谢  回复  更多评论   

# re: WM_CLOSE 和 WM_DESTORY 2009-12-25 10:02 twister

这个也可以
TerminateProcess(GetCurrentProcess(),0);  回复  更多评论   

# re: WM_CLOSE 和 WM_DESTORY 2009-12-25 20:21 woka

谢谢指教哈,不过感觉这样强制退出,最后应该有安全性方面的问题……@twister
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(2)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜