为什么PeekMessage不到东西

csdn5211 2010-05-03 01:31:01
一个基于对话框的程序,一点按钮就在上面画图,缓慢的画,画的过程中,可以点按钮暂停。

画的过程是用一个for循环里SetPixel实现的。

可是画的过程中,所有的按钮都不能点了,所以就没法暂停了。

请教了别人,告诉我在画的时候,for循环里每次SetPixel之前先PeekMessage,看看有没有按钮被按的消息。

可是加了PeekMessage之后,怎么按按钮,PeekMessage的返回值总是0,什么都没取到。

请问这是为什么?

ps:我本来要用多线程来实现,可是有限制条件禁止用多线程,所以大家不要建议用多线程了。
...全文
75 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn5211 2010-05-06
[Quote=引用 12 楼 uc_fly 的回复:]
请问楼主,你Peek到了Button按钮消息了吗?

真是搞不懂。。。你这个贴子是怎么结的。!?
[/Quote]

事实就是Peek到了……,我也没办法啊。
回复
uc_fly 2010-05-06
请问楼主,你Peek到了Button按钮消息了吗?

真是搞不懂。。。你这个贴子是怎么结的。!?
回复
schlafenhamster 2010-05-06
画的很慢,可以在OnIdle中进行
回复
csdn5211 2010-05-06
[Quote=引用 8 楼 schlafenhamster 的回复:]
最简单的就是画的时候,每次只画一个点不要堵塞主线程
[/Quote]

这个,有明确要求不许用多线程。有什么好的方法吗?大家介绍一下。
回复
尹成 2010-05-04
这个不对吧,PeekMessage与GetMessage内部实现是一样的,两者最大的区别在于,在没有消息时GetMessage是等待,也就是线程此时是暂停的,而PeekMessage在没有消息时是接着向下执行,所以你用PeekMessage处理的想法是正确的.我想你的代码应该问题
回复
schlafenhamster 2010-05-03
最简单的就是画的时候,每次只画一个点不要堵塞主线程
回复
wltg2001 2010-05-03
[Quote=引用 6 楼 uc_fly 的回复:]
引用 5 楼 wltg2001 的回复:
引用 4 楼 uc_fly 的回复:
按钮消息是通过SendMessage发送的,不经过消息队列,所以PeekMessage是获取不到的。

这个不对吧,PeekMessage与GetMessage内部实现是一样的,两者最大的区别在于,在没有消息时GetMessage是等待,也就是线程此时是暂停的,而PeekMessage在没有消息时是接着向下执行……
[/Quote]
按钮消息是通过SendMessage发送的,但是PeekMessage同样能取到,在SDK程序中,有主消息循环不用GetMessage而用PeekMessage建立的,同样也能正常工作.
一个消息是不是队列化的,实际对于编造者来说应该是透明的,不会影响到我们使用API.
回复
uc_fly 2010-05-03
[Quote=引用 5 楼 wltg2001 的回复:]
引用 4 楼 uc_fly 的回复:
按钮消息是通过SendMessage发送的,不经过消息队列,所以PeekMessage是获取不到的。

这个不对吧,PeekMessage与GetMessage内部实现是一样的,两者最大的区别在于,在没有消息时GetMessage是等待,也就是线程此时是暂停的,而PeekMessage在没有消息时是接着向下执行,所以你用PeekMessage处理的想法是……
[/Quote]
呵呵,对不对,你可以试一下嘛?可不要妄加评论哦。
回复
wltg2001 2010-05-03
[Quote=引用 4 楼 uc_fly 的回复:]
按钮消息是通过SendMessage发送的,不经过消息队列,所以PeekMessage是获取不到的。
[/Quote]
这个不对吧,PeekMessage与GetMessage内部实现是一样的,两者最大的区别在于,在没有消息时GetMessage是等待,也就是线程此时是暂停的,而PeekMessage在没有消息时是接着向下执行,所以你用PeekMessage处理的想法是正确的.我想你的代码应该问题,下面是应用PeekMessage的常用写法
while(1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
//这里表示有消息,按正常的消息分发机制进行处理.
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//这里表示没有消息,向下执行.
Game_Main();

} // end while

回复
uc_fly 2010-05-03
按钮消息是通过SendMessage发送的,不经过消息队列,所以PeekMessage是获取不到的。
回复
疯癫小程序 2010-05-03
请问你PeekMessage里的最后一个参数设置为PM_REMOVE还是PM_NOREMOVE?一定要设成前者,不然消息你取出后将不会从消息队列中移除。另外就是你的wMsgFilterMin和wMsgFilterMax设置是否全为0,你要知道这两个参数规定了你取的消息的范围,如果都为0,那么将可以取到所有消息,比如你的赋值是1,20那么只能取索引值是第1至第20的消息。我想你可能是最后一个参数设置有问题吧?
回复
zjs2010 2010-05-03
[Quote=引用 1 楼 yy9061022 的回复:]
不懂帮顶
[/Quote]
en
回复
yy9061022 2010-05-03
不懂帮顶
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告