そのため、レイヤードウィンドウに画像を描画することについて、SOに関する多くのコードサンプル、ガイド、および回答を見つけました。純粋なHBITMAP
Sと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)