关于windows消息机制的问题

ronaldo17 2004-09-20 10:46:57
我的确不太懂windows的消息机制,我还想问一个问题应该是和消息机制相关的,我在消息循环里面写了一个页面刷新的函数refresh()
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
refresh();
}
}
return msg.wParam;
}
然后在回调函数里面的空格事件里面写了一个裁减图片的函数blt,
case VK_SPACE:
drawp.blt(drawp.x1,drawp.y1,drawp.x2,drawp.y2);
return 0;
然后我运行程序时单击空格按钮执行了裁减程序后,是不是又回到消息循环里面刷新页面去了,我想显示裁减的图片,即中止循环函数,有没有可能,请问你怎么样才能实现,希望你能给我一个解答!
还有一点需要说明的是refresh()函数
void refresh()
{
MakeRect(0,0,640,480);
lpDDSBuffer->BltFast(0,0,lpDDSMap,&r,NoKey);
POINT curpos;
GetCursorPos(&curpos);
for (int i=0;i<2;i++)
{
CursorX[i]=CursorX[i+1];
CursorY[i]=CursorY[i+1];
CursorX[2]=curpos.x;
CursorY[2]=curpos.y;
lpDDSBuffer->BltFast(CursorX[1],CursorY[1],lpDDSMouse,NULL,SrcKey);
}
Flip();
}
如果我把第一和第二句注视掉那么就能够一按空格就显示出我裁减的图片,不过屏幕上鼠标所有滑过的痕迹都会显示,如果我不注视掉,鼠标滑过的痕迹就不会显示,不过就会出现我前面提到过的问题,不能显示裁减的部分!
裁减函数我是这样写的:void draw::blt(int x1,int y1,int x2,int y2)
{
HDC hdc;
x1=drawp.x1;
y2=drawp.y1;
x2=drawp.x2;
y2=drawp.y2;
MakeRect(x1,y1,x2,y2);
lpDDSBuffer->BltFast(0,0,lpDDSMap,&r,SrcKey);


}
...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ronaldo17 2004-09-22
  • 打赏
  • 举报
回复
我最后采用了kofightas(刘明) 的方法,而且我看了很多源代码,感觉几乎都是这种方法实现的,你的方法不尽让我解决了一个问题,而且思路上豁然开朗,感觉自己又有了很多问题的新的解决办法,非常感谢,另外我也要感谢 allsword(长剑) ,虽然我没有用你的方法,那是因为我自己没有理解offscreen的方法,但同时我还是要看写你参与回答我的问题,非常感谢你们,不过最后我希望你们能告诉关于offscreen的例题及帮助文档在SDK下的什么地方,我还是想去看看这个问题关于这方面的介绍,希望两位能给我关于offscreen在SDK的路径。
ronaldo17 2004-09-20
  • 打赏
  • 举报
回复
mouse的轨迹不用显示,就在mousemove事件里面写另外一个函数就可以实现,这个我能做到,不过,再按“空格”后,应该结束原来的一直再消息循环的refresh()函数,再屏幕上只显示我裁减的区域,现在我确定裁减是成功了的,不过没有显示出来,不过你说的方法我可以去试试,谢谢了哈
kofightas 2004-09-20
  • 打赏
  • 举报
回复
offscreen和flip没冲突

楼主的程序结构有问题。
游戏中不要在多个地方对屏幕进行绘制,特别别在windows消息处理函数里。
你应该把所有要绘制画面的部分都放到refresh()里,在case VK_SPACE:处可以做一个标记,然后在下次refresh()时进行相应的屏幕绘制。
你的程序具体问题我不想分析了,你照我说的思路改一下试试吧。

关于主循环是这样的,每次循环到peekmessage检查当前消息队列里有没有消息,如果有转入消息处理,没有的话你的refresh()就可以得到执行。无论进消息处理函数还是refresh(),执行完后继续循环。
allsword 2004-09-20
  • 打赏
  • 举报
回复
不过用了Offscreen则flip就用不了啦,
只能用Blt,
关于Offscreen可参见SDK下自带例题及帮助文档。
allsword 2004-09-20
  • 打赏
  • 举报
回复
楼主的意思是不是想,在一按“空格”时,就执行裁减同时还显示mouse的轨迹,
这其实是一般程序为恐避之不及的反其道而为之:
用Offscreen,
用建lpDDSBuffer,再建一个Offscreen存放显示原图,
将原图的Offscreen Blt到lpDDSBuffer,再将mouse轨迹Blt进去,
再Blt到主界面
如果要恢复到没裁前时没mouse轨迹则将原图的Offscreen Blt到lpDDSBuffer.
ronaldo17 2004-09-20
  • 打赏
  • 举报
回复
有没有人给我一个解释呀。是不是说得太多了,大家难得看啊,其实没那么复杂,就是怎么样结束消息循环然后,触发你键盘按键的事件
ronaldo17 2004-09-20
  • 打赏
  • 举报
回复
何解?
xiangding 2004-09-20
  • 打赏
  • 举报
回复
难.

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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