سؤال

وأنا أعرف ربما أنا في عداد المفقودين شيء، لكنني لا يمكن أن يبدو للحصول على ويندوز لإظهار المعاينة المصغرة الحية بشكل صحيح عند استخدام النافذة التي لديها المنطقة. عندما ضرب زر تصغير المعاينة ومقطع لحجم الحد الأدنى (160x25) بدلا من إظهار المعاينة الكاملة (مثل هو الحال مع غيرها من النوافذ).

وعدد قليل من النقاط لجعل:

1) المعاينة يعمل بشكل جيد في ويندوز لايف ماسنجر، لذلك برزت مايكروسوفت من وسيلة للقيام بذلك.

2) إذا أدعو SetWindowRgn فقط قبل نافذة مرئيا، أنه يعمل بشكل جيد (حتى ليس لها ذنب DWM لا يعرفون كيفية التعامل مع ويندوز regioned.) يمكن أن أدعو 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;
}
هل كانت مفيدة؟

المحلول

وردت مايكروسوفت لحادث دعم التكنولوجيا والمدرجة في ذلك خلل في ويندوز فيستا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top