Win32:工具栏对话框似乎永远不会得到焦点并导致主窗口处理缓慢?

我正在按照本教程编写应用程序。 我知道本教程的日期,因此,我已经调整了代码以考虑unicode。

我有一个看起来像MDI的主窗口。 然后,我有一个“ 视图”菜单,可以切换工具栏对话框以显示和隐藏。

当我显示对话框时,会显示该对话框,但PUSHBUTTON未正确显示。 它们仅在我再次单击主窗口时出现。

另外,我似乎无法点击任何PUSHBUTTON进入我的工具栏对话框。

资源( 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); } } 

这是我在WinMain函数中处理消息循环中主窗口和对话框的不同消息的方式。

 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); } } } 

我的问题是:

  1. 我似乎无法点击对话框的按钮。

  2. 当我尝试单击对话框的按钮时,我的主窗口响应自己的消息变得很慢。

也就是说,当我想将我的工具栏对话框显示为无模式对话框时,因为当我将其显示为模态时,它完美地运行!

有什么线索可以解决这个问题吗?

谢谢!

问题是,正如DReJ在上面的评论中所说,在我的消息泵中。

麻烦的是我写道:

 while (GetMessageW(&Msg, hWnd, 0, 0) > 0) { // Processing message here... } 

我会写:

 while (GetMessageW(&Msg, NULL, 0, 0) > 0) { // Processing message here... } 

所以,因为我正在获取给定窗口的消息,即hWnd实例,我的ToolbarDialog似乎没有时间完全绘制自己或类似的东西。 在该场景中将hWnd替换为NULL可以完全解决问题。