Win32 C ++ BitBlt透明度

埃文·卡斯雷克(Evan Carslake)

此帖子底部的更新外观我正在做的是尝试使用一个黑白位图,将背景位图放在白色上,并将图块覆盖在黑色上。我遇到的问题是添加叠加层。

这就是所有的部分

这是我的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和位图,但这是我无法弄清楚的方法。创建内存dc,并使用dc来保存位图,使用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);
马克·H

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

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

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

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Win32 C ++ BitBlt透明度

来自分类Dev

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

来自分类Dev

Win32 C ++ Alphablend位图部分透明

来自分类Dev

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

来自分类Dev

C ++,Win32错误

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在Win32上处理CTRL + C

来自分类Dev

C ++ NetBeans Win32 hwnd图标

来自分类Dev

C Win32:窗口自动关闭

来自分类Dev

C ++ Win32:加速位图操作

来自分类Dev

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

来自分类Dev

如何在C#中更改颜色的透明度

来自分类Dev

Qt上的C ++:控制标签和按钮的透明度

来自分类Dev

在Linux中的QT C ++中设置QButton的透明度

来自分类Dev

Visual Studio 2013 C++ 中的位图透明度

来自分类Dev

使编辑控件透明化WinAPI(win32)

来自分类Dev

Poco C ++库和Win32 GUI集成

来自分类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启用视觉样式吗?

来自分类Dev

C中的win32 FillRect()函数问题

来自分类Dev

C ++ Win32侦听全局按键绑定

来自分类Dev

使用mingw在win32上使用C printf()

来自分类Dev

我的Win32 C ++“ Hello World程序”无法编译