我在我的窗口的消息处理程序中得到几个WM_PAINT
消息/事件,而我调整了它的大小,即使我只翻译+调度一条消息。
这正常吗?为什么会发生这种情况?(我期望每次调度得到一个WM_PAINT消息,并且永远不会超过这个)
窗口循环:
while (true) // only for the example
{
std::cout << "Checking eventsn";
MSG winEvent = {};
while (PeekMessage(&winEvent, NULL, 0, 0, PM_REMOVE))
{
std::cout << "evn";
TranslateMessage(&winEvent);
DispatchMessage(&winEvent);
}
}
消息处理函数:
LRESULT CALLBACK windowEvent(HWND _hwnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
switch (_uMsg)
{
// extra cases removed for the example
case WM_PAINT:
std::cout << "PAINT EVENTn";
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
控制台输出:
- 在点击之前,许多"检查事件";和";ev"信息出现
- 当第一次点击窗口边框时,"ev"出现
- 按住左键,没有消息出现
- 按住并拖动使窗口更大,更"PAINT event";信息出现
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
答案很简单:
开始调整大小会进入一个嵌套的消息循环,这是您没有检测到的。
因此,你得到的消息是你自己编写的外循环所不知道的。
如果存在任何无效,则WM_PAINT
消息通常是为空消息队列生成的,而不是发布,这不会改变任何相关内容。