以前写的一篇文章,竟然无人欣赏(窗口破坏过程与Windows消息循环)

netcoder 2002-09-24 10:45:06
窗口破坏过程与Windows消息循环

从用户单击关闭按钮(标题栏最右边)或者用鼠标或鍵盘选择系统菜单的“关闭”选项,直到窗口消失,应用程序结束。这期间到底发生了什么呢?这曾经是我百思不得其解的问题,我想也会有很多人和我一样会碰到这个问题。所以我要把我的一些学习心得写出来,与大家共享:
1、首先会产生一个WM_SYSCOMMAND消息,如果程序员没有对此消息进行拦截,则由缺省的窗口函数DefWindowProc进行处理,如果表达式(LOWORD(wParam)&0xFFF0)==SC_CLOSE 成立,DefWindowProc发出一个WM_CLOSE消息。
2、同样,如果程序员没有对WM_CLOSE消息进行拦截,则还是由DefWindowProc进行处理,这次,她只简单的调用DestroyWindow函数,DestroyWindow先把窗口破坏掉,使用户看不到窗口。但是窗口破坏后,应用程序并没有结束,于是DestroyWindow再接再励,送出了一个WM_DESTROY消息。
3、这一次,WM_DESTROY被载获了,通常是会有这样的句子:
case WM_DESTROY:
PostQuitMessage(0);
...
这里PostQuitMessage函数很简单的发送一个WM_QUIT消息来响应WM_DESTROY
4、WM_QUIT消息非常特殊,她使GetMessage函数返回0,从而结束了消息循环,
应用程序从此结束。
下面我给出完整的证明程序,请大家一试:
#include <Windows.h>
#include <TCHAR.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR lpszCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[]="窗口";
char lpszTitle[]="窗口示例";
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc =WndProc;
wndclass.cbWndExtra=0;
wndclass.cbClsExtra =0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=lpszClassName;
if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hwnd=CreateWindow(lpszClassName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(1)
{
GetMessage(&Msg,NULL,0,0);
if(Msg.message==WM_QUIT)
{
MessageBox(NULL,_T("收到WM_QUIT,即将跳出消息循环"),_T("注意了"),MB_OK);
break;
}
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MessageBox(NULL,_T("已经跳出消息循环,应用程序即将结束!"),_T("注意了"),MB_OK);
return Msg.wParam;
}
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CLOSE:
MessageBox(NULL,_T("收到WM_CLOSE消息,即将调用 DestroyWindow(hwnd);"),_T("注意了"),MB_OK);
DestroyWindow(hwnd);
break;
case WM_DESTROY:
MessageBox(NULL,_T("已调用过DestroyWindow(hwnd),看不到窗口了吧;"),_T("注意了"),MB_OK);
MessageBox(NULL,_T("以下处理WM_DESTROY"),_T("注意了"),MB_OK);
PostQuitMessage(0);
break;
case WM_SYSCOMMAND:
if((LOWORD(wParam)&0xFFF0)==SC_CLOSE)
{
MessageBox(NULL,_T("你关闭了窗口,即将发送WM_CLOSE消息!"),_T("注意了"),MB_OK);
SendMessage(hwnd,WM_CLOSE,0,0);
}
//不要添加 break,否则不能响应其它WM_SYSCOMMAND消息
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}

...全文
96 110 打赏 收藏 转发到动态 举报
写回复
用AI写文章
110 条回复
切换为时间正序
请发表友善的回复…
发表回复
programmer200x 2002-11-26
  • 打赏
  • 举报
回复
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/11.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

11.exe - 2 error(s), 0 warning(s)
怎么回事儿?请大虾明示!
programmer200x 2002-10-27
  • 打赏
  • 举报
回复
很好啊。

谢谢了啊。
Jonak 2002-10-27
  • 打赏
  • 举报
回复
insert break point!
horin153 2002-10-26
  • 打赏
  • 举报
回复
写的真的不错!更佩服你的探索精神!想想现在编代码的有几个由此精神!UP
quchunyu 2002-10-16
  • 打赏
  • 举报
回复
这烂文章还置顶!
netcoder 2002-10-11
  • 打赏
  • 举报
回复
JustSoSoAtCn(JustSoSo):好象是权限的问题,我不太清楚
jason_sun22 2002-10-11
  • 打赏
  • 举报
回复
mark
javawang 2002-10-11
  • 打赏
  • 举报
回复
我从来没有考虑过这类问题,但却是有实际意义的,这到印证了四个字
“事出有因”。谢谢了。
OakMin 2002-10-10
  • 打赏
  • 举报
回复
very good!
wind7026 2002-10-10
  • 打赏
  • 举报
回复
up


so good!!!!!!!
myth_2002 2002-10-10
  • 打赏
  • 举报
回复
大哥真厉害,小弟有收获
JustSoSoAtCn 2002-10-10
  • 打赏
  • 举报
回复
Compiling...
Cpp1.cpp
e:\vc\wintry\cpp1.cpp(3) : fatal error C1083: Cannot open compiler intermediate file: 'D:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\a01704ex': Permission denied
Error executing cl.exe.

Cpp1.exe - 1 error(s), 0 warning(s)


这是我的问题
gexiankun 2002-10-09
  • 打赏
  • 举报
回复
<windows 程序设计>再版的时候可以把这个作为例子加上去了,呵呵
netcoder 2002-10-08
  • 打赏
  • 举报
回复
上面那为兄弟,我的程序是win32的
我又做了补充,请看:
http://www.csdn.net/expert/topic/1078/1078060.xml?temp=.1345941
honeybe 2002-10-08
  • 打赏
  • 举报
回复

Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/11.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

11.exe - 2 error(s), 0 warning(s)
怎么回事儿?请大虾明示!
flyinghark 2002-10-08
  • 打赏
  • 举报
回复
netcoder (四眼先锋) :好,希望多一些这样的文章
tingquan(匆匆过客) :用心良苦呀!很有深意
appmac 2002-10-07
  • 打赏
  • 举报
回复
up
eehinjor 2002-10-07
  • 打赏
  • 举报
回复
up
mo01 2002-10-07
  • 打赏
  • 举报
回复
刚才试过了,确实不错,谢谢
endurer 2002-10-07
  • 打赏
  • 举报
回复
有所收获,谢了

up
加载更多回复(90)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧