0

そのため、レイヤードウィンドウに画像を描画することについて、SOに関する多くのコードサンプル、ガイド、および回答を見つけました。純粋なHBITMAPSとWICライブラリを使用して描画しようとしましたが、今度はGDI +を使用して描画します(これははるかに単純で使いやすいように見えますが、これまでのところ、障害のあるWICコード)。

私は現在立ち往生していUpdateLayeredWindowます。何をしようとしても動かせません。現在、87、またはを返していERROR_INVALID_PARAMETERます。問題は、どちらが間違っているかということです。困った!UpdateLayeredWindow以下のコードは、動作を拒否しているという事実以外の解決策のようです。

私は何が間違っているのですか?

これは、HDC/ビットマップ情報/グラフィックスオブジェクトを設定するコードです。

// Create DC
_oGrphInf.canvasHDC = GetDC(_hwndWindow);

// Create drawing 'canvas'
_oGrphInf.lpBits = NULL;
_oGrphInf.bmpCanvas = CreateDIBSection(_oGrphInf.canvasHDC,
            &_oGrphInf.bmpWinInformation, DIB_RGB_COLORS,
            &_oGrphInf.lpBits, NULL, 0);

// Create graphics object
_oGrphInf.graphics = new Gdiplus::Graphics(_oGrphInf.canvasHDC);

上記は正常に機能します-私はそれをステップスルーし、すべてのポインターが機能します。

そして、これがPNGを描画する方法です。

void Splash::DrawPNG(PNG* lpPNG, int x, int y)
{
    LOGD("Drawing bitmap!");

    HDC hdcMem = CreateCompatibleDC(_oGrphInf.canvasHDC);

    // Select
    HBITMAP bmpOld = (HBITMAP)SelectObject(hdcMem, _oGrphInf.bmpCanvas);

    Gdiplus::Color trans(0, 0, 0, 0);
    _oGrphInf.graphics->Clear(trans);

    _oGrphInf.graphics->DrawImage(lpPNG->GetImage(), x, y);

    _oGrphInf.graphics->Flush();

    SIZE szSize = {_oGrphInf.bmpWinInformation.bmiHeader.biWidth,
                    _oGrphInf.bmpWinInformation.bmiHeader.biHeight};

    // Setup drawing location
    POINT ptLoc = {0, 0};
    POINT ptSrc = {0, 0};

    // Set up alpha blending
    BLENDFUNCTION blend = {0};
    blend.BlendOp = AC_SRC_OVER;
    blend.SourceConstantAlpha = 255;
    blend.AlphaFormat = AC_SRC_ALPHA;
    blend.BlendFlags = 0;

    // Update
    if(UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC, &ptLoc,
                                &szSize, hdcMem, &ptSrc,
                                (COLORREF)RGB(0, 0, 0),
                                &blend, ULW_ALPHA) == FALSE)
        LOGE("Could not update layered window: %u", GetLastError());

    // Delete temp objects
    SelectObject(hdcMem, bmpOld);
    DeleteObject(hdcMem);
    DeleteDC(hdcMem);
}

髪を抜く!ヘルプ?

編集:関数の呼び出しを書き直すことにしましたUpdateLayeredWindow。これにより、誤ったパラメーターの問題が解決されました。これが私が思いついたものです。ただし、それでも機能しません。私は何が間違っているのですか?

UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC,
            NULL, NULL, hdcMem, &ptLoc,
            RGB(0, 0, 0), &blend, ULW_ALPHA)
4

1 に答える 1

1

描画操作でアルファ情報を保持するには、HDC ではなく、メモリ バックアップされた Bitmap オブジェクトに基づいて Graphics オブジェクトを作成する必要があります。もちろん、Bitmap はアルファ チャネルを備えた形式である必要があります。

この Bitmap コンストラクターを使用する必要があります: http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx

0 のストライド、DIB のビットへのポインター、および PixelFormat32bppPARGB を指定するだけです。

次に、Graphics::FromImage を使用して Graphics オブジェクトを作成します。

UpdateLayeredWindow を使用したことがないため、その側が正しいことを確認できません。

于 2012-07-21T05:20:09.413 に答える