Question

Je sais qu'il me manque probablement quelque chose, mais je n'arrive pas à faire en sorte que Windows affiche correctement l'aperçu miniature en direct lorsque vous utilisez une fenêtre comportant une région. Lorsque vous appuyez sur le bouton Réduire, l'aperçu se clipse à la taille réduite (160x25) au lieu d'afficher l'aperçu complet (comme c'est le cas avec d'autres fenêtres).

Quelques remarques à faire:

1) L'aperçu fonctionne correctement dans Windows Live Messenger. Microsoft a donc trouvé un moyen de le faire.

2) Si j'appelle SetWindowRgn uniquement avant qu'une fenêtre ne soit visible, cela fonctionne correctement (ce n'est donc pas une faute du DWM ne sachant pas comment traiter les fenêtres avec régions.) Je peux appeler plusieurs fois avant que la fenêtre ne soit visible et ça marche très bien.

3) Je dois définir la région de la fenêtre après avoir affiché la fenêtre en cas de redimensionnement. Donc, un correctif à régler avant ne fonctionnera pas.

4) Même si vous utilisez la procédure de fenêtre par défaut, le bogue persiste. Donc, ce n’est pas une faute de traiter un message incorrectement (mais cela pourrait être une faute de 'ne pas traiter' un :))

5) Lorsque vous réduisez en cliquant sur le bouton de la barre des tâches (au lieu du bouton Réduire dans la fenêtre), la prévisualisation fonctionne normalement (même après avoir défini la région lorsqu'elle est visible). Encore une fois, cela prouve qu'il ne sait pas comment traiter l'aperçu.

Le bogue survient si je définis une région après avoir affiché la fenêtre. Code à suivre:

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;
}
Était-ce utile?

La solution

Microsoft a réagi à un incident d'assistance technique et l'a répertorié comme un bogue dans Vista.

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