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

标签 c++ winapi transparency bitblt

我最近问了一个关于这个的问题,并理解了答案,但无法将其转化为代码。经过又一天的摆弄东西,并修复了漏洞。不过,我真的无法在我的生活中解决这个问题。

这里略有不同,我需要做的就是在 map 位图下获取背景位图。 What I have

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 将背景 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);

关于c++ - Win32 C++ BitBlt 栅格方法和透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772486/

相关文章:

c++ - 如何枚举已分配指定用户权限的所有 SID? C++

android - 如何在 api 级别 7 (Android 2.1) 中设置整个 View 的 alpha 值

java - 形状 jdialog 用于透明效果,导致拖动问题

c++ - 在 Visual Studio C++ 中读取程序参数的问题

c++ - 通过套接字发送二进制文件

c++ - 如何知道何时将新文件添加到 Windows 中的文件系统?

css - 如何使 WebGL Canvas 透明

c++ - 如何获取 Windows 安装的更新

c++ - 如何在特定字节中设置一个值?

winapi - Win32 CreateWindow() 调用在子线程中挂起?