【发布时间】:2016-10-31 19:40:42
【问题描述】:
我有一个问题 - 我需要绘制两个 png 文件,一个在另一个上。当我以通常的方式进行操作时,会出现“闪烁”效果(第一张图像在一小段时间内过度绘制了第二张图像)。我使用 GDI+ 库,我的 WM_PAINT 处理如下所示:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint( hwnd, & ps );
displayImage(firstImage, hwnd);
displayImage(secondImage, hwnd);
EndPaint( hwnd, & ps );
break;
}
显示图像功能:
void displayImage(HBITMAP mBmp, HWND mHwnd)
{
RECT myRect;
BITMAP bm;
HDC screenDC, memDC;
HBITMAP oldBmp;
BLENDFUNCTION bf;
GetObject(mBmp, sizeof(bm), &bm);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xff;
bf.AlphaFormat = AC_SRC_ALPHA;
screenDC = GetDC(mHwnd);
GetClientRect(mHwnd, &myRect);
if (mBmp == NULL)
FillRect(screenDC, &myRect, WHITE_BRUSH);
else
{
memDC = CreateCompatibleDC(screenDC);
oldBmp = (HBITMAP)SelectObject(memDC, mBmp);
AlphaBlend (screenDC, 0, 0, myRect.right,myRect.bottom, memDC, 0, 0, bm.bmWidth,bm.bmHeight, bf);
SelectObject(memDC, oldBmp);
DeleteDC(memDC);
ReleaseDC(mHwnd, screenDC);
}
}
将文件加载到变量中:
HBITMAP mLoadImg(WCHAR *szFilename)
{
HBITMAP result=NULL;
Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
bitmap->GetHBITMAP(NULL, &result);
delete bitmap;
return result;
}
firstImage = mLoadImg(L"data\\img\\screen.png");
secondImage = mLoadImg(L"data\\img\\screen2.png");
我听说我应该做一个离屏绘图。那应该是什么样子?
【问题讨论】:
-
创建一个内存 dc,将你的位图加载到其中,然后获取窗口 dc 并以 memorydc 作为参数调用 bitblt
-
请注意,您的 ReleaseDC 应该在
else子句之外。 -
@jhbh:这并没有解决这个问题。它要求对两个图像进行 alpha 混合。