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, 0, 0)){
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, 0, 0, "VC++", strlen("VC++"));
DeleteDC(hdc);
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}