WIN32:工具栏对话框似乎永远不会得到焦点,并导致主窗口处理缓慢?
题
我正在写一个申请 本教程. 。我知道这个教程日期,因此,我已经调整了代码以考虑到Unicode。
我有一个看起来像MDI的主窗口。然后,我有一个 看法 菜单可以切换一个工具栏对话框,以显示和隐藏。
当我显示对话框时,将显示它,但是 PUSHBUTTON
S未正确显示。它们仅在我再次单击主窗口时才出现。
另外,我似乎无法单击两个 PUSHBUTTON
s进入我的工具栏对话框。
资源(resource.h
)定义如下(仅显示与此问题相关的内容):
#define IDD_TOOLBAR 102
#define IDC_PRESS 1000
#define IDC_OTHER 1001
#define ID_VIEW_SHOWTOOLBAR 40002
#define ID_VIEW_HIDETOOLBAR 40003
和对话如下如下 .rc
文件:
IDD_TOOLBAR DIALOGEX 0, 0, 85, 50
STYLE DS_FIXEDSYS | DS_MODALFRAME | WS_CAPTION | WS_POPUP
EXSTYLE WS_EX_TOOLWINDOW
CAPTION L"Toolbar"
FONT 8, "MS Shell Dlg"
BEGIN
PUSHBUTTON L"&Press this button", IDC_PRESS, 7, 7, 70, 14
PUSHBUTTON L"&Or this one", IDC_OTHER, 7, 28, 70, 14
END
并显示如下以下 wndproc 功能:
// As a global variable I have my toolbar handler.
HWND g_hToolbar = NULL;
BOOL CALLBACK ToolbarDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case IDC_OTHER:
MessageBoxW(hWnd, L"You just clicked IDC_OTHER!", L"Information", MB_OK | MB_ICONINFORMATION);
break;
case IDC_PRESS:
MessageBoxW(hWnd, L"You just clicked ODC_PRESS!", L"Information", MB_OK | MB_ICONINFORMATION);
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
switch (Msg) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_VIEW_HIDETOOLBAR:
ShowWindow(g_hToolbar, SW_HIDE);
break;
case ID_VIEW_SHOWTOOLBAR:
if (NULL == g_hToolbar)
g_hToolbar = CreateDialogW(GetModuleHandle(NULL)
, MAKEINTRESOURCE(IDD_TOOLBAR)
, hWnd
, ToolbarDlgProc);
ShowWindow(g_hToolbar, SW_SHOW);
break;
}
break;
default:
return DefWindowProcW(hWnd, Msg, wParam, lParam);
}
}
这是我处理主窗口的不同消息的方式,以及我的消息循环中的对话框 温曼 功能。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
// Declaring, registring and creating my main window to hWnd here...
MSG Msg;
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd);
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
if (!IsDialogMessageW(g_hToolbar, &Msg)) {
TranslateMessage(&Msg);
DispatchMessageW(&Msg);
}
}
}
我的问题是:
我似乎无法单击对话框的按钮。
当我尝试单击对话框的按钮时,我的主窗口变得非常慢,无法响应其自己的消息。
也就是说,当我想将我的工具栏对话框显示为无模式对话框时,因为当我显示模式时,它可以很好地工作!
有任何解决这个问题的线索吗?
谢谢!
解决方案
正如Drej在上面的评论中所说的那样,问题是在我的消息泵中。
问题是我写了:
while (GetMessageW(&Msg, hWnd, 0, 0) > 0) {
// Processing message here...
}
我会写信:
while (GetMessageW(&Msg, NULL, 0, 0) > 0) {
// Processing message here...
}
所以,因为我收到了给定窗口的消息,所以 hwnd 实例,我的工具手段似乎没有时间完全绘制自己或类似的东西。更换 hwnd 为了 无效的 在这种情况下,完全解决了问题。
不隶属于 StackOverflow