问题描述
当我调整窗口大小时,我在窗口的消息处理程序中收到了几个 WM_PAINT
消息/事件,即使我只翻译+发送一条消息。
这正常吗?为什么会这样? (我原以为每次发送都会收到一条 WM_PAINT 消息,而且不会超过这个数)
窗口循环:
while (true) // only for the example
{
std::cout << "Checking events\n";
MSG winEvent = {};
while (PeekMessage(&winEvent,NULL,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,_lParam);
}
控制台输出:
- 点击之前,会出现许多“正在检查事件”和“ev”消息
- 第一次点击窗口边框时,出现“ev”
- 按住左键不显示任何消息
- 按住并拖动使窗口变大时,会出现更多“PAINT EVENT”消息
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
解决方法
答案很简单:
开始调整大小会进入一个嵌套的消息循环,一个你没有检测的循环。
因此,您会收到发布的消息,而您自己编写的外部循环却从未知道。
如果有任何失效,通常会为空消息队列生成 var html = HtmlService.createTemplateFromFile('Index')
html.data = data
html = html.evaluate();
消息,而不是发布,不会更改任何相关内容。