Вопрос

Я знаю, что, вероятно, что-то упускаю, но я не могу заставить окна правильно отображать предварительный просмотр миниатюр в реальном времени при использовании окна с регионом.При нажатии кнопки «Свернуть» предварительный просмотр будет обрезаться до минимизированного размера (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;
}
Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top