游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2654|回复: 7

关于windows消息机制问题

[复制链接]

5

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2004-9-20 10:47:00 | 显示全部楼层 |阅读模式
我的确不太懂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=CursorX[i+1];
CursorY=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);


}

68

主题

710

帖子

719

积分

高级会员

Rank: 4

积分
719
QQ
发表于 2004-9-20 12:24:00 | 显示全部楼层

Re:关于windows消息机制问题

看一看
WIN32工程的
上面那个特别大的SWITCH你就什么都明白了!!

5

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2004-9-20 15:19:00 | 显示全部楼层

Re:关于windows消息机制问题

能不能具体说说看在什么地方看吗?
是不是资料?那里有,给给下载地址,谢谢了哈

10

主题

314

帖子

314

积分

中级会员

Rank: 3Rank: 3

积分
314
QQ
发表于 2004-9-22 00:43:00 | 显示全部楼层

Re:关于windows消息机制问题

我想他是让你看看。由VC自己生成的WINDOWS框架代码。你可去看看那个消息循环中的SWITCH语句。

2

主题

30

帖子

30

积分

注册会员

Rank: 2

积分
30
发表于 2004-9-22 14:36:00 | 显示全部楼层

Re:关于windows消息机制问题

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
refresh();
}

没太看明白你逻辑?
没有peek到消息refresh?

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2004-9-22 17:52:00 | 显示全部楼层

Re:关于windows消息机制问题

PeekMessage返回false,没接收到消息就会refresh();

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2004-9-22 18:03:00 | 显示全部楼层

Re:关于windows消息机制问题

如果PeekMessage返回true说明消息队列有消息,PM_REMOVE从消息队列删除,然后把这个消息传到窗口注册的MsgProc

5

主题

16

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2004-9-22 20:45:00 | 显示全部楼层

Re:关于windows消息机制问题

感谢大家的帮忙,我解决了这个问题了(是江湖中一个高人解决的:)),事实上是我的逻辑上出现了问题,为了答谢大家的帮助我决定将我的解决方法写出来,以供大家以后使用:)
其实是我逻辑上出现了问题,游戏中不要在多个地方对屏幕进行绘制,特别别在windows消息处理函数里。
你应该把所有要绘制画面的部分都放到refresh()里,在case VK_SPACE:处可以做一个标记,然后在下次refresh()时进行相应的屏幕绘制。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 17:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表