2

いくつかの不透明な複雑なコントロールが配置された透明な背景を持つ Direct2D アプリケーションを作成したいと考えています。この問題は、いくつかの下位の問題に分けることができます。

アーキテクチャ:コントロールを子ウィンドウとして実装する必要がありますか? 子ウィンドウ機能を実装する Direct2D ポリゴンを作成するのではなく、これが正しいアプローチだと思います。

親ウィンドウを初期化してこれを実装しようとしました:

SetWindowLong(m_hwnd, GWL_EXSTYLE, GetWindowLong(m_hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(m_hwnd, 0, (255 * 50) / 100, LWA_ALPHA);

子ウィンドウをWS_CHILDとして作成します。これにより、背景を含むすべての D2D ドローイングが透明な子が作成されました。子を不透明にする方法が見つかりませんでした。子ウィンドウをWS_POPUPまたはWS_OVERLAPPEDとして作成すると、不透明度の問題は解決されますが、子ウィンドウは親とは無関係のデスクトップに配置されます。

レイヤードウィンドウ? レイヤード Windows で作業することにしましたが、VistaSP2 以降を対象としているため、より良い解決策があるかもしれません。ここで提供されている解決策を試しましたが、私もそれを実装できませんでした。

4

1 に答える 1

1

1 ピクセルあたり 32 ビットのウィンドウを作成するつもりですか? (コメントできなくてすみません、ここには十分な担当者がいません)

その場合、次のように、シーンの描画を終了するたびに、シーンの描画を終了するたびに、UpdateLayeredWindow (および初期化中の CreateDIBSection 呼び出し) を使用することが強制されます。

// Draw to your D2D1 RenderTarget here
RECT rcWin = {0};
GetWindowRect(hWnd,&rcWin);
POINT ptw = {rcWin.left,rcWin.top};
SIZE pts = {rcWin.right-rcWin.left,rcWin.bottom-rcWin.top};
POINT ptsrc = {0};
HDC ScreenDC = GetDC(0);
UpdateLayeredWindow( hWnd, ScreenDC, &ptw, &pts, MemDC, &ptsrc, 0, &bf, ULW_ALPHA);
ReleaseDC(0,ScreenDC);

初期化について:

RECT r = {0};
GetWindowRect(hWnd,&r);
HDC scrDC = GetDC(0);
MemDC = CreateCompatibleDC(scrDC);
ReleaseDC(0,scrDC);
if(!MemDC)
    { FailInit(); }
BITMAPINFO bmi = {0};
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biWidth = r.right-r.left;
bmi.bmiHeader.biHeight = r.bottom-r.top;
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
DIBSectionBitmap = CreateDIBSection(MemDC,&bmi,DIB_RGB_COLORS,0,0,0);
if(!DIBSectionBitmap)
    return 0;
OldBmp = (HBITMAP)SelectObject(MemDC,DIBSectionBitmap);
// Now create the HWND D2D1 RenderTarget.

リソースの解放について:

// Free the D2D1 RenderTarget here
if(MemDC && OldBmp)
    SelectObject(MemDC,OldBmp);
if(DIBSectionBitmap)
    DeleteObject(DIBSectionBitmap);
if(MemDC)
    DeleteDC(MemDC);
MemDC = 0;
OldBmp = 0;
DIBSectionBitmap = 0;

編集: MemDC、OldBmp、および DIBSectionBitmap はウィンドウごとです。MemDC は HDC です。OldBmp は HBITMAP です。DIBSectionBitmap は HBITMAP です。この時点で、子ウィンドウを自分のメイン ウィンドウの一部であるかのように、ピクセル単位のアルファ精度で描画できますが、フォーカスとメッセージを自分で処理する必要があります。

于 2013-08-08T22:11:22.367 に答える