请教关于Windows消息机制的问题

KyosukeNo1 2003-02-26 03:09:21
小弟在做DirectX程序,以下是游戏的循环(其中GameActive是全局变量,是游戏进行的标志)

GameActive = true; // 游戏开始
while(1)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if( GameActive )
{
myGame->Reflash();
}
}

消息函数里捕捉
case WM_KILLFOCUS:
GameActive = false;
break;
case WM_SETFOCUS:
GameActive = true;
break;
消息来设定当游戏窗口失去焦点时游戏停止,得到焦点后游戏重新开始

由于游戏是不断刷新画面的,我在刷新的函数加上了
if( GameActive )
{ // 如果当前的游戏在运作的话
GetClientRect( hwnd, &rect );
ClientToScreen( hwnd, (POINT*)&rect );
lpDDSPrimary->BltFast(rect.left, rect.top,lpDDSBack,NULL,NoKey);
}
来设定游戏运行时才刷新

现在在游戏窗口前把一个最小化的程序展开,没有问题;但如果把一个游戏窗口后面一个失去焦点的窗口提前到游戏窗口前时,则游戏程序会在改窗口上绘制一次画面,遮住改窗口的一些东西(但可以正常使用);另外如果QQ的选单申出来时,也会有上面的错误,请问这是为什么?
PS:本来想在游戏版提问,但那里的人气太少了



...全文
18 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
steve_shun 2003-03-05
  • 打赏
  • 举报
回复
KyosukeNo1(裕作) 大哥,好久不见了.帮你UP一下
KyosukeNo1 2003-03-05
  • 打赏
  • 举报
回复
llrock(百乐宝||昨夜星辰):我能找到的公开代码的游戏都是全屏的啊

不明白楼上的在说什么,不过我的画面不是变黑,只是在某种情况下失去焦点的时候进行了一个多余的重绘——我现在就想知道把后面窗口提前的时候,是不是先让后面窗口得到焦点,再让我的游戏窗口得到失去焦点的事件......
llrock 2003-03-05
  • 打赏
  • 举报
回复
如果没有,我想你一定会用缓冲机制,那么再你换页的时候做个判断,
HRESULT result;
result=lpdd->Flip(NULL,DDFLIP_WAIT);
if (result==DDERR_SURFACELOST)
{
lpdd->RestoreAllSurfaces( );
ReloadBitmap( );
}

llrock 2003-03-05
  • 打赏
  • 举报
回复
当你的绘图区失去焦点,directdraw也同时会失去了对页面的控制,就会发生"DDERR_SURFACELOST"错误。所以你应该使用下面的方法恢复页面,
lpdd->RestoreAllSurfaces( );
ReloadBitmap( );

不知道你做了这个工作没?
llrock 2003-03-04
  • 打赏
  • 举报
回复
昏倒!

楼主从网上找一个游戏的代码,看看就知道了。

睡...
载舟之水 2003-03-04
  • 打赏
  • 举报
回复
不清楚你的画面是怎么画上去的,一般画面变黑是因为刷新被覆盖重画或者是图象句柄被提前释放。
KyosukeNo1 2003-03-03
  • 打赏
  • 举报
回复
DX是在Winmain里设置一个循环不断刷新的,不能等WM_PAINT消息啊......
llrock 2003-03-03
  • 打赏
  • 举报
回复
声明一个WNDCLASSEX myWClass;
myWClass..lpfnWndProc=myWProc;
...
LRESULT CALLBACK myWProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(msg){
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
...//your paint progress
EndPaint(hwnd,&ps);
case ....
.....
}
}
应该没问题了
KyosukeNo1 2003-03-02
  • 打赏
  • 举报
回复
up
KyosukeNo1 2003-03-02
  • 打赏
  • 举报
回复
我的GameActive是全局变量
实验过,QQ弹出(没有点击)时,焦点还是在我的窗口上

另外对于WM_ACTIVATE我有这样的想法,不知道对不对:
当两个窗口同时存在Windows上(都并非最小化状态),无论用点击鼠标还是按键盘的方式让后面没有焦点的窗口获得焦点,Windows首先做的是让后面的窗口得到焦点并重绘(前面的窗口还没有收到失去焦点Msg),然后再让原来有焦点的窗口得到失去焦点的Msg......
载舟之水 2003-03-01
  • 打赏
  • 举报
回复
申明全局 static GameActive = true; 试试看
最好在QQ窗口弹出时跟踪刷新消息(WM_PAINT??)看看GameActive
KyosukeNo1 2003-02-27
  • 打赏
  • 举报
回复
楼上的那语句和我本来的效果一样啊:
我的是在失去焦点时把GameActive关了,楼上的是在失去焦点时检测当前有焦点的是否这个窗口
实行时完全一样。。。
suping 2003-02-27
  • 打赏
  • 举报
回复
if( ::getfocus() == this )
{ // 如果当前的游戏在运作的话
GetClientRect( hwnd, &rect );
ClientToScreen( hwnd, (POINT*)&rect );
lpDDSPrimary->BltFast(rect.left, rect.top,lpDDSBack,NULL,NoKey);
}
KyosukeNo1 2003-02-26
  • 打赏
  • 举报
回复
汗~~~没有人帮忙吗?
这类WinAPI的帖子,我真的不知道在什么板块贴的好了。。。
DoubleJiang 2003-02-26
  • 打赏
  • 举报
回复
是不是那里缺少判断条件
up

16,471

社区成员

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

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

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