Frage

Ich weiß, dass ich wahrscheinlich bin etwas fehlt, aber ich kann nicht scheinen, Fenster zu erhalten, die Live-Miniaturansicht korrekt angezeigt wird, wenn ein Fenster verwenden, das einen Bereich aufweist. Bei der Minimierung schlagen Taste wird die Vorschau auf die minimierte Größe (160x25) befestigen, anstatt die vollständige Vorschau zeigt (wie es mit anderen Fenstern der Fall ist).

Ein paar Punkte zu machen:

1) Die Vorschau funktioniert in Windows Live Messenger, fein, so Microsoft einen Weg gefunden, es zu tun.

2) Wenn ich SetWindowRgn rufe nur vor einem Fenster sichtbar ist, es funktioniert gut (so dass sie nicht ein Fehler des DWM nicht zu wissen, wie mit regioned Fenstern beschäftigen.) Ich nenne kann SetWindowRgn viele Male vor dem Fenster sichtbar ist und es funktioniert super.

3) Ich brauche den Fensterbereich zu setzen, nachdem ich aus dem Fenster im Fall eines Resize zeigen. So ein Update nur sie festlegen, bevor nicht funktionieren.

4) Auch wenn die Standardfensterprozedur verwendet wird, passiert der Fehler immer noch. So ist es kein Fehler eine Nachricht zu verarbeiten falsch (aber könnte ein Fehler von ‚nicht verarbeiten‘ seine one :))

5) Wenn durch Klicken auf die Schaltfläche der Taskleiste (anstelle der Minimieren-Schaltfläche im Fenster) minimiert wird, in der Regel die Vorschau funktioniert gut (auch nach der Region, wenn sichtbar) einstellen. Auch hier beweisen, dass dies nicht der Fall, wie mit der Vorschau beschäftigen.

Der Fehler passiert, wenn ich einen Bereich gesetzt, nachdem ich aus dem Fenster gezeigt habe. Code zu folgen:

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;
}
War es hilfreich?

Lösung

Microsoft reagierte auf einen technischen Support-Vorfall und notiert dies als Fehler in Vista.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top