说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

编辑:说三道四文库 发布时间:2018-06-19 04:38
HTML文档下载 WORD文档下载 PDF文档下载
小弟在做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:本来想在游戏版提问,但那里的人气太少了



是不是那里缺少判断条件
up
汗~~~没有人帮忙吗?
这类WinAPI的帖子,我真的不知道在什么板块贴的好了。。。
if( ::getfocus() == this )
{ // 如果当前的游戏在运作的话
GetClientRect( hwnd, &rect );
ClientToScreen( hwnd, (POINT*)&rect );
lpDDSPrimary->BltFast(rect.left, rect.top,lpDDSBack,NULL,NoKey);
}
楼上的那语句和我本来的效果一样啊:
我的是在失去焦点时把GameActive关了,楼上的是在失去焦点时检测当前有焦点的是否这个窗口
实行时完全一样。。。
申明全局 static GameActive = true; 试试看
最好在QQ窗口弹出时跟踪刷新消息(WM_PAINT??)看看GameActive
我的GameActive是全局变量
实验过,QQ弹出(没有点击)时,焦点还是在我的窗口上

另外对于WM_ACTIVATE我有这样的想法,不知道对不对:
当两个窗口同时存在Windows上(都并非最小化状态),无论用点击鼠标还是按键盘的方式让后面没有焦点的窗口获得焦点,Windows首先做的是让后面的窗口得到焦点并重绘(前面的窗口还没有收到失去焦点Msg),然后再让原来有焦点的窗口得到失去焦点的Msg......
up
声明一个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 ....
.....
}
}
应该没问题了
DX是在Winmain里设置一个循环不断刷新的,不能等WM_PAINT消息啊......
昏倒!

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

睡...
不清楚你的画面是怎么画上去的,一般画面变黑是因为刷新被覆盖重画或者是图象句柄被提前释放。
llrock(百乐宝||昨夜星辰):我能找到的公开代码的游戏都是全屏的啊

不明白楼上的在说什么,不过我的画面不是变黑,只是在某种情况下失去焦点的时候进行了一个多余的重绘——我现在就想知道把后面窗口提前的时候,是不是先让后面窗口得到焦点,再让我的游戏窗口得到失去焦点的事件......
KyosukeNo1(裕作) 大哥,好久不见了.帮你UP一下
当你的绘图区失去焦点,directdraw也同时会失去了对页面的控制,就会发生"DDERR_SURFACELOST"错误。所以你应该使用下面的方法恢复页面,
lpdd->RestoreAllSurfaces( );
ReloadBitmap( );

不知道你做了这个工作没?
如果没有,我想你一定会用缓冲机制,那么再你换页的时候做个判断,
HRESULT result;
result=lpdd->Flip(NULL,DDFLIP_WAIT);
if (result==DDERR_SURFACELOST)
{
lpdd->RestoreAllSurfaces( );
ReloadBitmap( );

          
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘