Win32: barre d'outils de dialogue semble jamais mise au point et provoque la fenêtre principale pour traiter lent?

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

  •  11-10-2019
  •  | 
  •  

Question

Je vous écris une application ce tutoriel . Je suis conscient du fait que cette date tutoriel, et en tant que tel, j'ai adapté le code pour prendre en considération l'unicode.

J'ai une fenêtre principale qui ressemble à un MDI. Ensuite, j'ai un Afficher Menu qui permet de basculer une boîte de dialogue Barre d'outils pour être affichée et masquée.

Quand je montre la boîte de dialogue, il est affiché, mais les PUSHBUTTONs ne sont pas affichés correctement. Ils apparaissent uniquement lorsque je clique à nouveau ma fenêtre principale.

De plus, je ne semble pas être en mesure de cliquer sur aucun des PUSHBUTTONs dans ma boîte de dialogue de la barre d'outils.

Les ressources (resource.h) sont définis comme suit (ne montrant que ce qui est pertinent à cette question):

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

Et la boîte de dialogue comme suit dans mon fichier .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

Et montrant suit comme dans mon WndProc fonction :

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

Et voici ma façon de gérer les différents messages pour ma fenêtre principale et mon dialogue dans ma boucle de message dans mon WinMain fonction .

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

Mon problème est:

  1. Je ne semble pas être en mesure de cliquer sur les boutons de mon dialogue.

  2. Lorsque je tente de cliquer sur les boutons de mon dialogue, ma fenêtre principale devient très lent à répondre à ses propres messages.

C'est, quand je veux montrer ma barre d'outils de dialogue comme un dialogue modales, parce que quand je le montre modales, cela fonctionne parfaitement!

Un indice pour résoudre ce problème?

Merci!

Était-ce utile?

La solution

Le problème est, comme Drej dit dans le commentaire ci-dessus, dans ma pompe de message.

Le problème est que je vous écris:

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

Et que je vais écrire:

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

Alors, parce que je recevais les messages pour une fenêtre donnée, hWnd par exemple, mon ToolbarDialog semblait manque de temps pour se tirer complètement ou quelque chose comme ça. Remplacement hWnd NULL dans ce scénario a résolu le problème tout à fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top