为什么PeekMessage不到东西

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

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

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

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

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

请问这是为什么?

ps:我本来要用多线程来实现,可是有限制条件禁止用多线程,所以大家不要建议用多线程了。
...全文
252 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
不懂帮顶

16,548

社区成员

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

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

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