문제

나는 아마도 무언가를 놓치고 있다는 것을 알고 있지만, 영역이있는 창을 사용할 때 Windows가 라이브 썸네일 미리보기를 올바르게 표시 할 수는 없습니다. 최소화 버튼을 누르면 미리보기가 전체 미리보기 (다른 창과 같이)를 표시하지 않고 최소화 된 크기 (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