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

StackOverflow https://stackoverflow.com/questions/4464740

  •  11-10-2019
  •  | 
  •  

我正在写一个申请 本教程. 。我知道这个教程日期,因此,我已经调整了代码以考虑到Unicode。

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

当我显示对话框时,将显示它,但是 PUSHBUTTONS未正确显示。它们仅在我再次单击主窗口时才出现。

另外,我似乎无法单击两个 PUSHBUTTONs进入我的工具栏对话框。

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

我的问题是:

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

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

也就是说,当我想将我的工具栏对话框显示为无模式对话框时,因为当我显示模式时,它可以很好地工作!

有任何解决这个问题的线索吗?

谢谢!

有帮助吗?

解决方案

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

问题是我写了:

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

我会写信:

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

所以,因为我收到了给定窗口的消息,所以 hwnd 实例,我的工具手段似乎没有时间完全绘制自己或类似的东西。更换 hwnd 为了 无效的 在这种情况下,完全解决了问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top