首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

哥哥姐姐们··小弟我哭了·

2012-03-29 
哥哥姐姐们我哭了先看下代码吧:C/C++ codewhile (msg.message ! WM_QUIT){//查看当前消息队列头是否有消

哥哥姐姐们··我哭了·
先看下代码吧:

C/C++ code
    while (msg.message != WM_QUIT)    {        //查看当前消息队列头是否有消息,有消息就会把第一参数        //填充为查看到消息,并可以决定是否移除这个消息        //1)消息地址        //2)窗口,为0则是所有窗口        //3)消息上限        //4)消息下限        //5)PM_REMOVE:移除消息、PM_NOREMOVE:不移除消息        //无论有无消息本函数都立即返回,有返回真,没有返回假        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }        else if (g_Act) //没有消息且激活的情况处理游戏        {            Run(); //运行                    }        else  //没有消息且没有激活的情况就等待消息            WaitMessage();    }



好了,意思就是如果有消息就把消息传给消息出来程序来解决
没有消息而且当前窗口有又是激活的状态的话那就运行程序
即没有消息有没有激活就等待消息。

困扰我的现象是:
这个时候我在窗口里一直移动鼠标,并且一直按着鼠标键不放货乱按鼠标键,同时按不停的敲击键盘。
我以为RUN是不会执行的,但是结果是一直在执行,简直就是无视我的一通消息发送。
这是一个问题

然后当窗口没又被激活的的时候,的确没有执行RUN了。但是一旦被其他窗口遮挡的时候,里面的所有画的东西就都没了。
所以必须要重绘。也就是说,不管是否激活都要运行。我试着改了下代码,结果更疯狂我了。

我这样改的:
C/C++ code
while (msg.message != WM_QUIT)    {        //查看当前消息队列头是否有消息,有消息就会把第一参数        //填充为查看到消息,并可以决定是否移除这个消息        //1)消息地址        //2)窗口,为0则是所有窗口        //3)消息上限        //4)消息下限        //5)PM_REMOVE:移除消息、PM_NOREMOVE:不移除消息        //无论有无消息本函数都立即返回,有返回真,没有返回假        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }        else //if (g_Act) //没有消息且激活的情况处理游戏        {            Run(); //运行                    }        //else  //没有消息且没有激活的情况就等待消息            WaitMessage();    }[/


把判断激活去掉了。这个时候应该是没有消息就直接运行,然后再等消息。
把我弄哭的是窗口上要刷的背景图是被刷出来了,但是苦逼的是应该一直动的图片却一直都不动。就等于是RUN根本就没有执
行,而且更残忍的是,当我懂鼠标的时候,RUN反而执行了,窗口里改动的图片反而动起来了,鼠标一停,又不执行RUN了。
而且窗口被其他窗口覆盖后,图片还是被覆盖来没有了,根本就没有重绘。

结果就是希望:没消息执行RUN,有消息不执行RUN,但是运行起来却是没消息不执行RUN,有消息反而执行RUN。

我哭了···

请问要怎么才能控制它 有消息的时候不指向RUN,没消息的时候执行RUN,而且不管是不是激活都要重绘啊。



[解决办法]
http://hi.baidu.com/1032443065/blog/item/24d0ac1d972ef2d2a68669fa.html

希望对你有帮助
[解决办法]
去看《windows程序设计》
[解决办法]
重绘代码放在WM_PAINT:后面

你的代码中没消息就在WaitMessage中等着,谁给你执行 run
[解决办法]
如果你要把背景的重绘出来应该放到WM_PAINT:里面,要不然当你切换窗口时windows不给你把背景重绘出来,所以必须得手动更新。
前面的说法是因为计算机的处理速度很快,所以当你不停的按鼠标键盘时要处理的消息对他来说是小ks了,所以给你感觉就是他没有停下来你可以这样写[code=C/C++][/code]
while (msg.message != WM_QUIT)
{
//查看当前消息队列头是否有消息,有消息就会把第一参数
//填充为查看到消息,并可以决定是否移除这个消息
//1)消息地址
//2)窗口,为0则是所有窗口
//3)消息上限
//4)消息下限
//5)PM_REMOVE:移除消息、PM_NOREMOVE:不移除消息
//无论有无消息本函数都立即返回,有返回真,没有返回假
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Run(); //运行
}

尝试一下吧
[解决办法]
给你一个 DirectX 游戏的调度程序。
把 WaitMessage 去掉。
C/C++ code
    while(msg.message != WM_QUIT)    {        if(::PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE))        {            ::GetMessage(&msg, NULL, 0, 0);            TranslateMessage(&msg);            DispatchMessage(&msg);        }#ifdef D3D        else        {            float currTime = (float)timeGetTime();            float timeDelta = (currTime - lastTime)*0.001f;            Display(timeDelta);            //WaitMessage();            lastTime = currTime;        }#endif    } 

热点排行