Vista живая миниатюра проблема с SetWindowRgn - PullRequest
0 голосов
/ 27 января 2009

Я знаю, что, возможно, что-то упустил, но я не могу получить окна, чтобы правильно показывать предварительный просмотр в реальном времени при использовании окна, в котором есть область. При нажатии кнопки минимизации предварительный просмотр будет обрезаться до минимизированного размера (160x25), а не показывать полный предварительный просмотр (как это происходит с другими окнами).

Несколько замечаний:

1) Предварительный просмотр отлично работает в Windows Live Messenger, поэтому Microsoft нашла способ сделать это.

2) Если я вызываю SetWindowRgn только до того, как окно становится видимым, оно работает нормально (поэтому не является ошибкой то, что DWM не знает, как обращаться с регионарными окнами.) Я могу вызвать SetWindowRgn много раз, прежде чем окно станет видимым и это прекрасно работает.

3) Мне нужно установить область окна после того, как я показываю окно в случае изменения размера. Поэтому исправление, установленное до этого, не будет работать.

4) Даже при использовании оконной процедуры по умолчанию ошибка по-прежнему возникает. Таким образом, это не ошибка неправильной обработки сообщения (но может быть ошибка «не обработки» :))

5) При минимизации путем нажатия кнопки на панели задач (вместо кнопки минимизации в окне) предварительный просмотр обычно работает нормально (даже после установки области, когда она видна). Еще раз доказав, что это не так, как бороться с предварительным просмотром.

Ошибка возникает, если я установил регион после того, как показал окно. Код для следования:

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;
}

1 Ответ

0 голосов
/ 28 сентября 2009

Microsoft отреагировала на инцидент технической поддержки и перечислила это как ошибку в Vista.

...