Win32: Toolbar Dialog scheint nie Fokus zu erhalten und bewirkt, dass sich das Hauptfenster langsam verarbeiten?

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

  •  11-10-2019
  •  | 
  •  

Frage

Ich schreibe eine Anwendung folgende dieses Tutorial . Ich bin mir bewusst, dass dieses Tutorial Daten, und als solche habe ich den Code angepasst haben Berücksichtigung der Unicode zu nehmen.

Ich habe ein Hauptfenster, das wie ein MDI aussieht. Dann habe ich eine Menü, das eine Toolbar Dialog schaltet wie ein- und ausgeblendet werden.

Wenn ich den Dialog zeigen, ist es angezeigt, aber die PUSHBUTTONs werden nicht richtig angezeigt. Sie erscheinen nur, wenn ich wieder mein Hauptfenster klicken.

Plus, ich habe nicht in der Lage sein scheinen weder der PUSHBUTTONs in meiner Symbolleiste Dialog zu klicken.

Die Ressourcen (resource.h) sind wie folgt definiert (nur zeigen, was auf diese Frage relevant ist):

#define IDD_TOOLBAR              102
#define IDC_PRESS               1000
#define IDC_OTHER               1001
#define ID_VIEW_SHOWTOOLBAR    40002
#define ID_VIEW_HIDETOOLBAR    40003

Und der Dialog wie folgt in meiner .rc-Datei:

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

Und zeigt es folgt wie in meinem WndProc Funktion:

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

Und hier ist die Art, wie ich die verschiedenen Nachrichten für meine Hauptfenster behandeln und meinen Dialog in meiner Nachrichtenschleife in meiner WinMain Funktion.

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

Mein Problem ist:

  1. Ich scheine nicht in der Lage sein, auf meinem Dialogs des Schaltflächen zu klicken.

  2. Wenn ich auf Tasten meines Dialoges klicken versuchen, wird mein Hauptfenster sehr langsam reagieren auf seine eigenen Nachrichten.

Das heißt, wenn ich meinen Toolbar Dialog als modalen Dialog angezeigt werden soll, denn wenn ich zeige es Modal, es funktioniert perfekt!

Jeder Hinweis, dieses Problem zu lösen?

Danke!

War es hilfreich?

Lösung

Das Problem ist, wie Drej in dem obigen Kommentar sagte, in meinem Meldungsverteilschleife.

Das Problem ist, dass ich schreiben:

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

Und das werde ich schreiben:

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

Also, weil ich die Nachrichten für ein bestimmtes Fenster bekommen, die hWnd So schien mein ToolbarDialog Mangel an Zeit selbst ganz oder etwas ähnliches zu ziehen. Ersetzen hWnd NULL in dem Szenario, das Problem vollständig gelöst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top