كيف أقوم بمسح هدف عرض Direct2D للشفافية تمامًا
-
25-09-2019 - |
سؤال
أنا أحاول رسم مستطيلات شبه شفافة على 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 آخر قد تصطدم به ... إذا كانت النافذة شفافة بما فيه الكفاية ، فستذهب نقرات الماوس إلى النافذة الأساسية.