奇怪的if语句导致计时器关闭
weird if statement causing to shut timer
所以我一直在尝试计算以下内容:
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC; // Display context handle
PAINTSTRUCT PaintSt; // Structure defining area to be drawn
RECT aRect; // A working rectangle
HPEN hPen; // A working pen
HBRUSH hBrush; // A working brush
switch(message)
{
case WM_TIMER:
switch(wParam)
{
case IDT_TIMER1:
redraw = true;
InvalidateRect(hWnd, NULL, TRUE);
case IDT_TIMER2:
if(keys[UP])
{
rect2.bottom -= 5;
rect2.top -= 5;
}
if(keys[DOWN])
{
rect2.bottom += 5;
rect2.top += 5;
}
if(keys[RIGHT])
{
rect2.left += 5;
rect2.right += 5;
}
if(keys[LEFT])
{
rect2.left -= 5;
rect2.right -= 5;
}
}
return 0;
case WM_PAINT:
//if(redraw)
{
redraw = false;
render_frame();
}
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP:
keys[UP] = true;
break;
case VK_DOWN:
keys[DOWN] = true;
break;
case VK_LEFT:
keys[LEFT] = true;
break;
case VK_RIGHT:
keys[RIGHT] = true;
break;
default:
break;
}
return 0;
case WM_KEYUP:
switch(wParam)
{
case VK_UP:
keys[UP] = false;
break;
case VK_DOWN:
keys[DOWN] = false;
break;
case VK_LEFT:
keys[LEFT] = false;
break;
case VK_RIGHT:
keys[RIGHT] = false;
break;
default:
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam); // default message processing
}
}
所以问题来了:在的情况下,WM_PAINT:,当我取消对if语句的注释时,由于某种原因,时间停止了计时。我不知道为什么,也不知道如何将其与任何事情联系起来。因此,如果我取消注释它,它将不会渲染,也不会从另一个计时器(有两个计时器)接收信息。请帮帮我,如果这很傻,请不要笑。
WM_TIMER消息是一条"低优先级"消息,只有在不需要执行其他操作时才会生成。WM_PAINT处理程序的问题在于,它不会在第一次生成时绘制,也就是在创建窗口后立即绘制。EndPaint()未被调用,这会使"window is dirty"状态位处于打开状态。这会立即导致生成另一条WM_PAINT消息。这仍然无法绘制,因为重绘不是真的。等等,你的应用程序在WM_PAINT消息上燃烧100%的核心,并且永远不会空闲到足以生成WM_TIMER消息。
只需删除重绘测试即可解决问题。总是在Windows要求时绘制。或者将消息传递给DefWindowProc()。
在不绘制任何内容的情况下处理WM_PAINT
(假设redraw
为false),甚至不调用DefWindowProc
都是非常不正统的。你的应用程序甚至可能在你没有注意到的情况下仍然存在。
来自文档:
应用程序必须调用BeginPaint和EndPaint以响应WM_PAINT消息,或将消息传递给DefWindowProc函数以验证窗口。DefWindowProc验证更新区域;它如果窗口后台需要,可以发送WM_ERASEBKGND消息被擦除。
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 计时器坏了或者其他什么的
- 功能计时器阻止主功能继续
- IO服务重新启动后,Boost最后期限计时器持续触发
- boost asio计时器是否会在"取消"时阻塞
- C - 如何制作一个简单的计时器,以及如何使用基于语句的语句使用
- 奇怪的if语句导致计时器关闭