سؤال

أنا أحاول رسم مستطيلات شبه شفافة على hwnd غير مرئي. ومع ذلك ، فإن مسح النافذة باستخدام ID2D1HWNDrenderTarget :: Clear فقط يجعل النافذة بأكملها سوداء ، لذلك عندما أرسم مستطيلات في الأعلى ، فإنها تبدو شبه سوداء.

إذا لم أكن قد أوضحت () ولم أرسم ، فإن النافذة غير مرئية ، كما ينبغي. Clear () هو الجاني هنا ؛ ومع ذلك ، إذا لم أستخدمه ، فسيشعر الطلاء بشكل سيء للغاية.

إليك الرمز الذي أستخدمه في WindowProc:

case WM_PAINT:
    // Begin drawing
    pRenderTarget->BeginDraw();
    pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());

    // Clear the window
    pRenderTarget->Clear();

    // Paint the panel and its children
    D2DSurface()->StartPainting();
    {
        D2DSurface()->PaintTraverse(panel);
    }
    D2DSurface()->FinishPainting();

    // Finish drawing
    HRESULT hr = plat->pRenderTarget->EndDraw();

شكرا لك مقدما!

هل كانت مفيدة؟

المحلول

عند إنشاء RenderTarget الخاص بك ، يجب أن تخبر D2D أنك تريد استخدام Alpha (في الوضع الأولي) بتنسيق البكسل:

  HRESULT hr = mD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat( DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED ) ),
    D2D1::HwndRenderTargetProperties( mWindow, size ),
    &mRenderTarget );

بعد هذا ، الاتصال Clear() مع قيمة ألفا من الصفر تعمل على ما يرام.

نصائح أخرى

الشفافية مشكلة. النافذة الوحيدة التي تدعم شفافية لكل بكسل هي WS_EX_LAYERED Windows. تم تصميم هذه النوافذ لاستخدامات مثل أيقونات Drag-Drop ، وهذا يؤدي إلى مشاكل في كل استخدام آخر.

يتطلب استخدام D2D مع WS_EX_Layered Windows استخدام هدف عرض DXGI. إلى الانحناء ، يمكنك الحصول على DC من هدف العرض ثم قم بتمرير ذلك إلى النافذة ذات الطبقات وأخبر النافذة ذات الطبقات لتحديث نفسها. (جرب هذا باستخدام HwndrenderTarget - من المحتمل أن يعطل برنامج الجهاز).

أظن أن نافذتك تبدو شفافة لأنها لا ترسم على الإطلاق.

gotcha آخر قد تصطدم به ... إذا كانت النافذة شفافة بما فيه الكفاية ، فستذهب نقرات الماوس إلى النافذة الأساسية.

يستخدم ID2D1DCRendTarget بدلاً من ID2D1HwndRendTarget, ، ثم ربط سياق الجهاز (DC) من نافذتك قبل بدء الرسم.

بالطبع ، تحتاج إلى ضبط WS_EX_LAYERED لنافذتك ثم اتصل SetLayeredWindowAttributes لتعيين اللون الشفاف:

SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 0, LWA_COLORKEY);

لقطة شاشة:

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