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

埃文·卡斯雷克(Evan Carslake)

最近,我问了一个问题,并理解了答案,但无法将其转换为代码。经过一天的混乱,修复泄漏。但是,我从字面上看无法解决这个问题。

这稍有不同,我所要做的就是获取地图位图下的背景位图。我拥有的

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);

我的问题是结合起来...创建内存dc以保持栅格操作的结果。我根本无法解决这个问题,任何帮助都会很棒。

谢谢。

杰里·科芬

可能最困难的部分是中间的矩形。遮罩中的其他白色区域是背景应显示的位置,但是在该矩形内,您有白色应该显示背景的位置

目前,我将假设我们可以从不同颜色的部分开始。只要透明部分是唯一的,我们对透明部分(背景应该显示的部分)使用哪种颜色并不重要现在,我假设它是254、254、254的RGB值-代码不会将其误认为纯白色(255、255、255),但通常在视觉上无法区分。

这样,工作就变得非常简单:我们可以使用TransparentBlt处理透明度,因此您可以使用BitBlt将背景蒙版到目标,然后使用TransparentBlt将蒙版蒙版到目标。简化一点(省去我们暂时不在意的参数),代码看起来像这样:

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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Win32 C ++ BitBlt透明度

来自分类Dev

Win32 C ++ BitBlt透明度

来自分类Dev

Win32 C ++ Alphablend位图部分透明

来自分类Dev

C ++ Win32静态控件透明背景

来自分类Dev

Poco C ++库和Win32 GUI集成

来自分类Dev

C ++ 11和Win32 wchar_t

来自分类Dev

C ++,Win32错误

来自分类Dev

C ++ Win32 API GDI:矩形抗锯齿在透明背景下无法正常工作

来自分类Dev

适用于Windows 7的C和Win32中的WebSocket客户端

来自分类Dev

如何使用WIN32 API for C ++更改文本的颜色和大小?

来自分类Dev

C ++ WIN32在共享内存中创建整数和布尔数组

来自分类Dev

使用Win32 C ++和钩子从应用程序中的按钮获取文本

来自分类Dev

在Win32中有多少种方法可以执行C ++

来自分类Dev

用作 Win32 回调时是否需要固定 C# 方法?

来自分类Dev

在Win32上处理CTRL + C

来自分类Dev

C ++ NetBeans Win32 hwnd图标

来自分类Dev

C Win32:窗口自动关闭

来自分类Dev

C ++ Win32:加速位图操作

来自分类Dev

PAR和Win32 :: Exe

来自分类Dev

我们可以互换控制台和Win32 C ++的命令和功能吗?

来自分类Dev

Win32控制台写入(C / C ++)

来自分类Dev

Win32无法添加具有透明度的自定义工具栏图标

来自分类Dev

在C ++ Win32程序中,如何修改菜单标题?

来自分类Dev

Win32 API C ++菜单栏

来自分类Dev

Win32 C ++可以重新使用“旧位图”吗?

来自分类Dev

Win32(C ++)中的选项卡损坏

来自分类Dev

Win32 C ++检测USB驱动器损坏

来自分类Dev

C ++ Win32 Api资源文件

来自分类Dev

使用C ++ Win32 API启用视觉样式吗?