【问题标题】:Win32 C++ BitBlt Raster Methods and TransparencyWin32 C++ BitBlt 光栅方法和透明度
【发布时间】:2014-03-13 09:48:06
【问题描述】:

我最近问了一个关于这个的问题,并理解了答案,但无法将其翻译成代码。经过又一天的乱七八糟的东西,并修复泄漏。不过,我真的无法为我的生活弄清楚这一点。

这个略有不同,我只需要获取背景位图,在地图位图下即可。

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 以保留光栅操作的结果。我完全无法理解这一点,任何帮助都会很棒。

谢谢。

【问题讨论】:

    标签: c++ winapi transparency bitblt


    【解决方案1】:

    可能最困难的部分是中间的矩形。蒙版中的其他白色区域是背景应该显示出来的地方,但在那个矩形内,背景应该显示出来的地方是白色的。

    目前,我假设我们可以从这些不同颜色的部分开始。我们为透明部分(背景应该显示的部分)使用什么颜色并不重要,只要它是唯一的。现在我假设它是 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多