2009-01-27 18 views
0

Je sais que je suis probablement manquant quelque chose, mais je ne peux pas sembler obtenir des fenêtres pour afficher l'aperçu de vignette en direct correctement lors de l'utilisation d'une fenêtre qui a une région. Lorsque vous appuyez sur le bouton de réduction, la prévisualisation se clipse sur la taille réduite (160x25) plutôt que sur l'aperçu complet (comme avec les autres fenêtres).Vista en direct problème de vignette avec SetWindowRgn

Quelques points à faire:

1) Les travaux aperçu bien dans Windows Live Messenger, de sorte que Microsoft a trouvé un moyen de le faire. 2) Si j'appelle SetWindowRgn seulement avant qu'une fenêtre soit visible, cela fonctionne bien (donc ce n'est pas une faute du DWM ne sachant pas comment traiter les fenêtres régionalisées). Je peux appeler SetWindowRgn plusieurs fois avant que la fenêtre 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, une solution pour le régler avant ne fonctionnera pas.

4) Même en utilisant la procédure de fenêtre par défaut, le bug persiste. 5) En minimisant en cliquant sur le bouton de la barre des tâches (au lieu du bouton de réduction dans la fenêtre),

l'aperçu fonctionne normalement correctement (même après avoir défini la région lorsqu'elle est visible). Encore une fois prouver qu'il ne sait pas comment faire face à l'aperçu.

Le bug se produit si je définis une région après que j'ai montré 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; 
} 

Répondre

0

Microsoft a répondu à un incident de support technique et a répertorié ce problème comme un bogue dans Vista.