gpt4 book ai didi

c++ - Win32 C++ BitBlt 透明度

转载 作者:行者123 更新时间:2023-11-30 01:54:45 25 4
gpt4 key购买 nike

更新了这篇文章底部的外观我正在做的是尝试使用一个黑白位图,在白色上放置一个背景位图,然后在黑色上覆盖图 block 。我遇到的问题是添加叠加层。

This is all the parts

这是我的 BitBlt() 代码,此代码生成 #5。

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground); // #2
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap); // #1
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);

hOldBitmap = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay); // #4
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);

我不确定是否使用相同的“hOldBitmp”,但它似乎以任何一种方式做同样的事情。

透明的 blt 函数在这里也不能完全满足。

谢谢。

我在合并和存储时遇到了问题。我可以稍微处理 DC 和位图,但这是我无法弄清楚如何做的一件事......创建内存 dcs 和 dcs 来保存位图,dc 用于另一个位图,然后 bitblt 到内存。我觉得……

这是我目前的冗余代码。真的,我需要伪代码方面的帮助,如何组合位图……需要多少个 DC,等等。

buffer.getBufferDC() 是显示在屏幕上的主要 DC。

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
HDC hdcMem3 = CreateCompatibleDC(hdc);
HDC hdcMem4 = CreateCompatibleDC(hdc);
HBITMAP hbmMem3 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
HBITMAP hbmMem4 = CreateCompatibleBitmap(hdc, WINDOW_WIDTH, WINDOW_HEIGHT);
ReleaseDC(hWnd, hdc);

// Copy the map and clean the hdcMem
HBITMAP hbmOld;
hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
hbmOld = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCAND);
SelectObject(hdcMem2, hbmOld);

hbmOld = (HBITMAP)SelectObject(hdcMem3, bitmap.hbmMapOverlay);
hbmOld = (HBITMAP)SelectObject(hdcMem4, bitmap.hbmMap);
BitBlt(hdcMem3, 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem4, 0, 0, SRCINVERT);

BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem3, 0, 0, SRCPAINT);
//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMap);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCPAINT);
//SelectObject(hdcMem, hbmOld);


//hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmMapOverlay);
//BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCAND);
//SelectObject(hdcMem, hbmOld);

DeleteDC(hdcMem);
DeleteDC(hdcMem2);
DeleteDC(hdcMem3);
DeleteDC(hdcMem4);

最佳答案

使用 SRCAND 将 hbmpBackground 与 hbmMap 结合起来,就像您在 3 中所做的那样。

将 hbmMapOverlay 与倒置的 hbmMap 结合(SRCINVERT 应该这样做)。

使用 OR (SRCPAINT) 合并这两个结果

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com