[API]提问
我的消息循环是这么写的:
while(true)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)
break;
if(msg.message!=WM_PAINT)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
MessageBox(NULL,"ok","ok",0);
}
}
}
我的用意是截获WM_PAINT的消息,并显示一个弹出框,但是事实是,弹出框确实出来了,但是窗口中的图形他也画了,也就是WINDOWS 调用了回掉函数,这是怎么回事?
还有,《WINDOWS程序设计》中有这么一段话:
“。。。。GetMessage并不从消息队列中删除WM_PAINT消息。。。。。”
按照我的理解,这个函数从消息队列里面得到一个消息,并处理完后,就应该把这个消息删除的,这里面到底是怎么回事啊,哪位请详细回答一下,谢谢,:)
问题点数:20、回复次数:14Top
1 楼xujungood(flyboy)回复于 2004-07-02 11:44:48 得分 0
自己顶上去Top
2 楼runall(龙行天下)回复于 2004-07-02 12:54:31 得分 0
我来帮你顶Top
3 楼lianglp(寻找黄金分割点)回复于 2004-07-02 13:48:52 得分 0
不会从线程消息队列中删除,它需要用BeginPaint()函数进行删除WM_PAINT消息。
Top
4 楼yeyuboy(海绵)回复于 2004-07-02 14:01:57 得分 0
WINDOWS收到某些消息时会去直接调用窗口函数。Top
5 楼xujungood(flyboy)回复于 2004-07-02 15:12:13 得分 0
是不是windows执行MessageBox的时候,直接调用了窗口函数,而没有把消息放到消息队列里面去?
还有,如果GETMESSAGE函数没有删除处理过的消息的话,消息队列不是越来越长了?
Top
6 楼needways(天涯浪子)回复于 2004-07-02 15:23:04 得分 0
MessageBox 是一个模式对话框,它在里面处理了消息循环。大概像这样:
HWND hWndMsgBox = X;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsDialogMessage(hWndMsgBox, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}Top
7 楼xujungood(flyboy)回复于 2004-07-02 19:57:59 得分 0
这个对话矿的消息循环和我的窗口消息有什么联系呢?
怎么会调用我的窗口函数呢?Top
8 楼needways(天涯浪子)回复于 2004-07-02 20:02:06 得分 0
GetMessage 从消息队列中取出消息,然后通过 DispatchMessage 调用窗口的处理程序。Top
9 楼xujungood(flyboy)回复于 2004-07-02 23:47:28 得分 0
我的理解是:
WINDOWS把消息发送给我的那个弹出对话矿窗口,然后,这个对话矿发现消息不是他的,就马上发还给了WINDOWS,WINDOWS再调用了我的窗口函数 ,而没有经过我的主窗口的消息队列,是吗?
Top
10 楼xujungood(flyboy)回复于 2004-07-02 23:52:02 得分 0
但是WINDOWS为什么要把这个消息直接发送给那个子对话矿呢?也就是那个弹出窗口,
我是菜鸟,想搞清楚些,麻烦大虾了^_^Top
11 楼needways(天涯浪子)回复于 2004-07-02 23:53:12 得分 15
消息是发送到了消息队列的。只是在 MessageBox 中调用 GetMessage 读出来了,然后再用
IsDialogMessage 来判断是否是 MessageBox 对话框的消息,如果不是的话就用 TranslateMessage 进行消息转换,然后用 DispatchMessage 分发。Top
12 楼jronald(深白色)回复于 2004-07-03 00:14:40 得分 5
在进入while循环之前,windows已经通过窗口过程处理了许多消息,准确地说,对CreateWindowEx,ShowWindow,UpdateWindow三个函数的调用会产生一堆消息让窗口过程处理(如WM_GETMINMAXINFO,WM_NCCREATE,WM_NCCALCSIZE,WM_CREATE,....),其中,WM_PAINT是UpdateWindow产生出来的,windows在进入while(true)循环前已经通过窗口函数处理了这些消息,而不是把这些消息依次放到消息队列中,然后等待while中的PeekMessage之类的函数来取消息再用DispatchMessage分派消息Top
13 楼xujungood(flyboy)回复于 2004-07-03 12:56:18 得分 0
哦,明白了,是因为我的程序阻塞在了MESSAGEBOX这个函数,也就是主窗口的循环没有进行,程序控制权在那个弹出窗口中,这个弹出窗口负责从消息队列中取出消息,他发现消息不是他的,就调用DISPATCHMSG这个函数重新发送,而没有经过我的主窗口的消息循环,
是这样的吧,呵呵
该怎么结分?谢谢大虾了,^_^Top
14 楼xujungood(flyboy)回复于 2004-07-09 13:57:04 得分 0
是不是跳出模式对话矿后,主程序的消息循环就阻塞在MESSAGEBOX这点,而消息由模式对话矿的消息循环进行处理?
而跳出非模式对话矿的时候,消息仍然由主程序的消息循环处理?Top




