【发布时间】:2012-07-20 05:24:39
【问题描述】:
所以我在 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)
【问题讨论】:
标签: c++ image gdi+ layered-windows ws-ex-layered