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

И вот как я обращаюсь к различным сообщениям для своего главного окна и диалога в моем цикле сообщения в моем 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. Когда я пытаюсь нажать на кнопки моего диалога, мое главное окно становится очень медленным, чтобы отвечать на свои собственные сообщения.

То есть, когда я хочу показать свой диалог на панели инструментов в качестве бесконечного диалога, потому что, когда я показываю его модально, он работает отлично!

Любая подсказка для решения этой проблемы?

Спасибо!

Это было полезно?

Решение

Проблема в том, что, как сказал Дрей в приведенном выше комментарии, в моем насосе сообщения.

Проблема в том, что я пишу:

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

И что я напишу:

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

Итак, потому что я получал сообщения для данного окна, hwnd Пример, мой инструмент Bardialog, казалось, не имел времени, чтобы нарисовать себя полностью или что -то в этом роде. Замена hwnd за НУЛЕВОЙ В этом сценарии полностью решил проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top