一次发送获取多条 WM_PAINT 条消息
Getting several WM_PAINT message with one dispatch
我在 window 的消息处理程序中收到多个 WM_PAINT
messages/events ,同时我调整它的大小,即使我只翻译+发送一条消息。
这正常吗?为什么会这样? (我希望每次发送都能收到一条 WM_PAINT 消息,而且不会超过)
Window循环:
while (true) // only for the example
{
std::cout << "Checking events\n";
MSG winEvent = {};
while (PeekMessage(&winEvent, NULL, 0, 0, PM_REMOVE))
{
std::cout << "ev\n";
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 EVENT\n";
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
控制台输出:
- 点击之前,会出现许多“正在检查事件”和“ev”消息
- 第一次点击 window 的边框时,会出现“ev”
- 按住左键单击时,没有消息出现
- 按住并拖动使 window 变大时,会出现更多“PAINT EVENT”消息
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
答案很简单:
开始调整大小会进入一个嵌套的消息循环,您没有使用它。
因此,您收到的已发布消息是您自己编写的外循环所不知道的。
如果有任何无效,WM_PAINT
消息通常是为空消息队列生成的,而不是发布的,不会改变任何相关内容。
我在 window 的消息处理程序中收到多个 WM_PAINT
messages/events ,同时我调整它的大小,即使我只翻译+发送一条消息。
这正常吗?为什么会这样? (我希望每次发送都能收到一条 WM_PAINT 消息,而且不会超过)
Window循环:
while (true) // only for the example
{
std::cout << "Checking events\n";
MSG winEvent = {};
while (PeekMessage(&winEvent, NULL, 0, 0, PM_REMOVE))
{
std::cout << "ev\n";
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 EVENT\n";
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
控制台输出:
- 点击之前,会出现许多“正在检查事件”和“ev”消息
- 第一次点击 window 的边框时,会出现“ev”
- 按住左键单击时,没有消息出现
- 按住并拖动使 window 变大时,会出现更多“PAINT EVENT”消息
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
答案很简单:
开始调整大小会进入一个嵌套的消息循环,您没有使用它。
因此,您收到的已发布消息是您自己编写的外循环所不知道的。
如果有任何无效,WM_PAINT
消息通常是为空消息队列生成的,而不是发布的,不会改变任何相关内容。