所以我發現了很多關於將圖像繪製到分層窗口的代碼示例,指南和答案。我嘗試過使用純HBITMAP
S和WIC庫進行繪製,現在我正在使用GDI +進行繪製(這非常簡單並且看起來更容易使用,並且迄今爲止它已解決了許多導致的錯誤由錯誤的WIC代碼)。C++ GDI +圖層分層窗口上的圖像無法正常工作
我目前卡在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)
此外,您可能應該在(0,0)處繪製圖像,因爲您的分層窗口應該足夠大才能顯示圖像。或者,更簡單的方法是完全跳過Graphics對象,並使用帶有用戶輸入緩衝區的Bitmap :: Lock將Bitmap中的位複製到dib部分。 – 2012-07-21 05:27:22