8

見えないHWNDに半透明の長方形を描画しようとしています。ただし、ウィンドウをクリアするとウィンドウID2D1HwndRenderTarget::Clear全体が黒くなるので、上に長方形を描くと半黒に見えます。

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();

前もって感謝します!

4

3 に答える 3

5

透明性が問題です。ピクセルごとの透明度をサポートする唯一のウィンドウは、WS_EX_LAYEREDウィンドウです。これらのウィンドウは、ドラッグアンドドロップアイコンなどの用途向けに設計されており、他のすべての用途で問題が発生します。

WS_EX_LAYEREDウィンドウでD2Dを使用するには、DXGIレンダーターゲットを使用する必要があります。EndDrawを実行するには、レンダリングターゲットからDCを取得し、それをレイヤードウィンドウに渡して、レイヤードウィンドウにそれ自体を更新するように指示します。(HWNDRenderTargetでこれを試してください-おそらくデバイスドライバーがクラッシュします)。

まったく描画されていないため、ウィンドウが透明に見えると思われます。

あなたが遭遇するかもしれないもう一つの落とし穴...ウィンドウが十分に透明であるならば、マウスクリックはそれを通り抜けて下にあるウィンドウに行きます。

于 2010-10-28T02:10:22.960 に答える
1

RenderTarget を作成するときは、D2D に、ピクセル形式でアルファ (事前乗算モード) を使用することを伝える必要があります。

  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()と問題なく動作します。

于 2012-05-16T22:29:24.257 に答える