Jeh*_*joa 9 c++ user-interface winapi postmessage
在我的C++应用程序的GUI对象中,我在主窗口过程中有以下内容:
case WM_SIZE:
{
OutputDebugString(L"WM_SIZE received.\n");
RECT rect = {0};
GetWindowRect(hwnd, &rect);
if (!PostMessage(0, GUI_MSG_SIZECHANGED, w, MAKELONG(rect.bottom - rect.top, rect.right - rect.left))) {
OutputDebugString(L"PostMessage failed.\n"); // <--- never called
}
}
return 0; // break;
Run Code Online (Sandbox Code Playgroud)
GUI对象还具有以下getMessage()方法:
int GUI::getMessage(MSG & msg) {
BOOL result = 0;
while ((result = GetMessage(&msg, 0, 0, 0)) > 0) {
if (msg.message > (GUI_MSG_BASE-1) && msg.message < (GUI_MSG_LAST+1)) {
OutputDebugString(L"GUI message received.\n");
break;
}
else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
应用程序对象以下列方式调用此方法:
while ((result = _gui.getMessage(msg)) > 0) {
switch (msg.message) {
// TODO: Add gui message handlers
case GUI_MSG_SIZECHANGED:
OutputDebugString(L"GUI_MSG_SIZECHANGED received.\n");
_cfg.setWndWidth(HIWORD(msg.lParam));
_cfg.setWndHeight(LOWORD(msg.lParam));
if (msg.wParam == SIZE_MAXIMIZED)
_cfg.setWndShow(SW_MAXIMIZE);
else if (msg.wParam == SIZE_MINIMIZED)
_cfg.setWndShow(SW_MINIMIZE);
else if (msg.wParam == SIZE_RESTORED)
_cfg.setWndShow(SW_SHOWNORMAL);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序对象对窗口大小感兴趣,因为它将此信息存储在配置文件中.
当我在Visual Studio的调试器中运行它时,在调整窗口大小后输出窗口如下所示:
WM_SIZE received.
GUI message received.
GUI_MSG_SIZECHANGED received.
WM_SIZE received.
WM_SIZE received.
WM_SIZE received.
WM_SIZE received.
...etc...
Run Code Online (Sandbox Code Playgroud)
PostMessage()函数永远不会失败,但似乎只在第一次处理WM_SIZE时发送GUI_MSG_SIZECHANGED(#defined为WM_APP + 0x000d),这是在处理WM_CREATE之后.
我不知道是什么原因引起的.我尝试使用SendMessage和PostThreadMessage,但结果是一样的.另请阅读MSDN的消息处理文档,但无法找到我的代码有什么问题.
有人可以帮忙吗?
黑客攻击自定义消息循环是你有一天会后悔的.你早点打它.
不要发布带有NULL窗口句柄的消息,它们只有在您可以保证程序只泵送自定义消息循环时才能工作.你无法做出这样的保证.一旦启动对话框或Windows决定自行抽取消息循环,这些消息就会落入位桶.当用户调整窗口大小时,调整大小逻辑是模态的.Windows泵出自己的消息循环,WM_ENTERSIZEMOVE宣布它.如果线程能够显示任何窗口,这也是PostThreadMessage是邪恶的原因.即使是MessageBox也是致命的.DispatchMessage无法传递消息.
创建一个充当控制器的隐藏窗口.现在,您可以在其窗口过程中检测GUI_MSG_SIZECHANGED,并且不需要对消息循环进行任何操作.该控制器很少是您的应用程序的主窗口顺便说一句.
| 归档时间: |
|
| 查看次数: |
1935 次 |
| 最近记录: |