Domanda

So che probabilmente mi manca qualcosa, ma non riesco a far visualizzare correttamente l'anteprima delle anteprime di Windows quando si utilizza una finestra con una regione. Quando si preme il pulsante Riduci a icona, l'anteprima verrà ritagliata alla dimensione ridotta (160x25) anziché mostrare l'anteprima completa (come avviene con altre finestre).

Pochi punti da sottolineare:

1) L'anteprima funziona bene in Windows Live Messenger, quindi Microsoft ha trovato un modo per farlo.

2) Se chiamo SetWindowRgn solo prima che una finestra sia visibile, funziona benissimo (quindi non è un difetto del DWM che non sa come gestire le finestre con area geografica.) Posso chiamare SetWindowRgn molte volte prima che la finestra sia visibile e funziona benissimo.

3) Devo impostare la regione della finestra dopo aver mostrato la finestra in caso di ridimensionamento. Quindi una correzione per impostarla prima non funzionerà.

4) Anche quando si utilizza la procedura predefinita della finestra, il bug si verifica comunque. Quindi non è un errore elaborare un messaggio in modo errato (ma potrebbe essere un errore di "non elaborare" uno :))

5) Quando si minimizza facendo clic sul pulsante della barra delle applicazioni (anziché sul pulsante Riduci a icona nella finestra), l'anteprima normalmente funziona bene (anche dopo aver impostato l'area quando visibile). Ancora una volta dimostrando che non è in grado di gestire l'anteprima.

Il bug si verifica se imposto una regione dopo aver mostrato la finestra. Codice da seguire:

void create(HINSTANCE hInst)
{
    char* className = "default";

    /* Register
    */
    WNDCLASSEX wcex;
    memset(&wcex,0,sizeof(wcex));
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = DefWindowProc;
    wcex.hInstance      = hInst;
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszClassName  = className;
    RegisterClassEx(&wcex);

    /* Create
     */
    HWND hwnd = CreateWindow(className, className, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL);

    /* 
     * Set the region
     * If set before the window is shown for the first time, minimize preview on vista works
     */

    RECT rect;
    GetWindowRect(hwnd,&rect);
    HRGN rgn = CreateRoundRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top,15,15);
    SetWindowRgn(hwnd,rgn,TRUE);

    /* Show the window
     */

    ShowWindow(hwnd,SW_SHOW);

    /* 
     * Set the region a second time.
     * Doing this will break minimize preview on vista
     */

    rgn = CreateRoundRectRgn(0,0,rect.right-rect.left,rect.bottom-rect.top,35,35);
    SetWindowRgn(hwnd,rgn,TRUE);
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
    MSG msg;

    create(hInstance);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}
È stato utile?

Soluzione

Microsoft ha risposto a un incidente di supporto tecnico e lo ha elencato come un bug all'interno di Vista.

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