Win32: Barra de herramientas de diálogo parece que nunca obtener el foco y hace que la ventana principal para proceso lento?

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

  •  11-10-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación siguiendo este tutorial . Soy consciente de que este tutorial fechas, y como tal, que se han adaptado el código para tener en cuenta la Unicode.

Tengo una ventana principal que se parece a un MDI. Entonces, tengo una Ver menú que cambia un cuadro de diálogo Barra de herramientas para expandir y contraer.

Cuando muestro el cuadro de diálogo, se muestra, pero los PUSHBUTTONs no se muestran correctamente. Sólo aparecen al hacer clic en la ventana principal de nuevo.

Además, no parecen ser capaces de hacer clic en ninguno de los PUSHBUTTONs en mi diálogo barra de herramientas.

Los recursos (resource.h) se definen de la siguiente manera (sólo mostrando lo que es relevante para esta pregunta):

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

Y el cuadro de diálogo de la siguiente en mi archivo .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

Y mostrándolo como sigue en mi función 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);
    }
}

Y aquí está la forma en que manejo los diferentes mensajes para mi y mi ventana principal de diálogo en mi bucle de mensajes en mi función 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);
        }
    }
}

Mi problema es:

  1. No parece ser capaz de hacer clic en los botones de mi diálogo.

  2. Cuando intento hacer clic en los botones de mi diálogo, la ventana principal se vuelve muy lento para responder a sus propios mensajes.

Es decir, cuando quiero mostrar mi barra de herramientas de diálogo como un diálogo no modal, porque cuando lo muestro modal, funciona perfectamente!

Cualquier pista para resolver este problema?

Gracias!

¿Fue útil?

Solución

El problema es, como dijo Drej en el comentario anterior, en mi suministro de mensajes.

El problema es que escribo:

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

Y que voy a escribir:

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

Por lo tanto, debido a que estaba recibiendo los mensajes de una ventana determinada, la CVent ejemplo, mi ToolbarDialog parecía a la falta de tiempo para dibujar por completo o algo parecido. Reemplazando CVent NULL en ese escenario resolvió el problema por completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top