哥哥姐姐们··我哭了·
先看下代码吧:
- 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 }