繁体   English   中英

Win32 C ++ BitBlt栅格方法和透明度

[英]Win32 C++ BitBlt Raster Methods and Transparency

我最近问了一个关于这个的问题,并理解了答案,但无法将其翻译成代码。 经过另一天弄乱了东西,并修复了泄漏。 不过,我真的不能为我的生活做出这样的决定。

这有点不同,我需要做的就是在地图位图下获取背景位图。 是)我有的

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);       

HBITMAP hbmOld2 = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCPAINT); 

SelectObject(hdcMem2, hbmOld2);

我的问题是结合...创建内存dcs以保持光栅操作的结果。 我完全无法理解这一点,任何帮助都会很棒。

谢谢。

可能最困难的部分是中间的矩形。 在面具的其它白色区域的背景应该显示过的地方,但矩形的内部你有白凡背景应该显示出来。

目前,我将假设我们可以从那些不同颜色的部分开始。 它并不真正的问题,我们只要它的独特使用什么颜色的透明部分(其中的背景应该显示的部分)。 现在我假设它是254,254,254的RGB值 - 代码不会将它误认为纯白色(255,255,255),但通常在视觉上无法区分。

这样,工作变得非常简单:我们可以使用TransparentBlt来处理透明度,因此您使用BitBlt将背景blit到目标,然后使用TransparentBlt将掩码blit到该目标。 简化一下(省略了我们目前不太关心的参数)代码看起来像这样:

HDC mask, background, combined;

mask =       CreateCompatibleDC(screen);
background = CreateCompatibleDC(screen);
combined =   CreateCompatibleDC(screen);

HBITMAP mask_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_MASK));
HBITMAP back_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_BKGND));
HBITMAP result = CreateCompatibleBitmap(screen);

mask_original = Selectobject(mask, mask_bmp);
back_original = SelectObject(background, back_bmp);
combined_original = SelectObject(combined, result);

BitBlt(background, result, SRCCOPY);
TransparentBlt(mask, result, RGB(254, 254, 254));

BitBlt(result, screen, SRCCOPY);

SelectObject(mask, mask_original);
SelectObject(background, back_original);
SelectObject(combined, combined_original);

DeleteDC(mask);
DeleteDC(background);
DeleteDC(combined):
DeleteObject(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM