Win32: dialogo Toolbar sembra mai messa a fuoco e fa sì che la finestra principale per processo lento?

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

  •  11-10-2019
  •  | 
  •  

Domanda

Sto scrivendo una domanda in seguito questo tutorial . Sono consapevole che questo tutorial di date, e come tale, ho adattato il codice per prendere in considerazione l'unicode.

Ho una finestra principale che si presenta come un MDI. Poi, ho un Visualizza menu che alterna una finestra Barra degli strumenti per essere mostrato e nascosto.

Quando mostro la finestra di dialogo, viene visualizzato, ma i PUSHBUTTONs non vengono visualizzati correttamente. Essi appaiono solo quando clicco di nuovo la mia finestra principale.

Inoltre, non mi sembra di essere in grado di fare clic su nessuno dei PUSHBUTTONs nella mia finestra della barra degli strumenti.

Le risorse (resource.h) sono definite come segue (solo mostrando ciò che è rilevante a questa domanda):

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

E la finestra di dialogo come segue nel mio file .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

E mostrando come segue nel mio WndProc Funzione:

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

Ed ecco il mio modo di gestire i diversi messaggi per il mio finestra principale e la mia finestra del mio ciclo di messaggi nel mio WinMain la funzione.

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

Il mio problema è il seguente:

  1. Non mi sembra di essere in grado di fare clic sui pulsanti del mio dialogo.

  2. Quando tento di fare clic sui pulsanti del mio dialogo, la mia finestra principale diventa molto lento a rispondere ai propri messaggi.

Cioè, quando voglio mostrare il mio dialogo Toolbar come un dialogo non modale, perché quando lo mostro modale, funziona perfettamente!

Qualsiasi indizio per risolvere questo problema?

Grazie!

È stato utile?

Soluzione

Il problema è, come ha detto Drej nel commento di cui sopra, nella mia pompa messaggio.

Il problema è che scrivo:

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

E che io scriverò:

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

Quindi, perché mi è stato sempre i messaggi per una determinata finestra, la hWnd esempio, il mio ToolbarDialog sembrava la mancanza di tempo per disegnare se stesso completamente o qualcosa di simile. Sostituzione hWnd per NULL in questo scenario ha risolto il problema del tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top