创建掩码位图来实现透明绘图
2009-05-26 21:17
447 查看
前面有篇文章讲到如何进行透明贴图,其实主要用在一些不规则控件UI的制作上面。那个用到的方法是制作一张掩码位图,然后利用BitBlt提供的一些光栅操作进行透明绘制。
有时候人家可能仅仅提供一张需要透明显示的位图,而并没有同步提供掩码位图,怎么办呢?非要人家提供或者我们自己制作一张? 太麻烦了,有没有简单的程序实现方法?本文将简单介绍下通过程序如果创建给定位图的掩码位图,然后绘制透明效果。
其实在使用ImageLIst的时候我们就应该知道,如果ImageList的是Icon,由于本身Icon就可以是透明的,所以不需要指定什么透明色;但是如果ImageList的item是Bitmap,而我们想要透明绘制的话,就需要制定透明色,也就是位图掩码色。同样的道理,对于给定的位图同时,需要为其指定掩码色maskColor。
下面简单介绍下绘制的整个流程。
假设需要在制定窗口下绘制资源id为IDB_BITMAP1的位图。方法如下:
1、创建兼容DC,加载指定的位图资源,将其选入到前面创建的兼容dc中
HBITMAP hbmp = ::LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
BITMAP bmpInfo;
::GetObject((HGDIOBJ)hbmp, sizeof(BITMAP), &bmpInfo);
HWND hDesktop = ::GetDesktopWindow();
HDC hDesktopDC = ::GetDC(hDesktop);
HDC hSrcDc = ::CreateCompatibleDC(hDesktopDC);
HBITMAP hSrcBitmap = ::CreateCompatibleBitmap(hDesktopDC, bmpInfo.bmWidth, bmpInfo.bmHeight);
::SelectObject(hSrcDc, hbmp);
2、创建单色掩码位图(和原图一般大小,其中原图掩码色部分为白色,其它为黑色)
::SetBkColor(hSrcDc, RGB(0xff, 0, 0xff)); // 将透明色设置为背景色
HDC hMaskDC = ::CreateCompatibleDC(hDesktopDC);
HBITMAP hMaskBmp = ::CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight, 1, 1, 0);
HBITMAP hOldMaskBmp = (HBITMAP)::SelectObject(hMaskDC, hMaskBmp);
::BitBlt(hMaskDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hSrcDc, 0, 0, SRCCOPY);
3、修改源图,使得其颜色图部分为黑色
:SetBkColor(hSrcDc, RGB(0, 0, 0));
::SetTextColor(hSrcDc, RGB(0xff, 0xff, 0xff));
::BitBlt(hSrcDc, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hMaskDC, 0, 0, SRCAND);
4、获取要绘制的窗口dc,并且进行透明绘制
HDC hdcMainWnd = ::GetDC(g_hMainWnd); // 要绘制的窗口dc
::SetBkColor(hdcMainWnd, RGB(0xff, 0xff, 0xff));
::SetTextColor(hdcMainWnd, RGB(0, 0, 0));
::BitBlt(hdcMainWnd, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hMaskDC, 0, 0, SRCAND);
::BitBlt(hdcMainWnd, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hSrcDc, 0, 0, SRCPAINT);
也就上述4个步骤。这里主要用到BitBlt的几个光栅操作。需要注意的是在BitBlt操作中,如果srcDC和dstDC的位图格式不一样的话,需要进行相应的格式转换。也就是单色位图到彩色位图的转换规则,这个看看msdn关于BitBlt的说明即可,充分利用到dstDC的前景色和背景色。这也是为啥上述代码中频繁调用SetBkColor和SetTextColor的目的所在。由于只是解释绘制原理用,几乎所有的资源都没有删除(ReleaseDC)和恢复(SelectObject等)。
有时候人家可能仅仅提供一张需要透明显示的位图,而并没有同步提供掩码位图,怎么办呢?非要人家提供或者我们自己制作一张? 太麻烦了,有没有简单的程序实现方法?本文将简单介绍下通过程序如果创建给定位图的掩码位图,然后绘制透明效果。
其实在使用ImageLIst的时候我们就应该知道,如果ImageList的是Icon,由于本身Icon就可以是透明的,所以不需要指定什么透明色;但是如果ImageList的item是Bitmap,而我们想要透明绘制的话,就需要制定透明色,也就是位图掩码色。同样的道理,对于给定的位图同时,需要为其指定掩码色maskColor。
下面简单介绍下绘制的整个流程。
假设需要在制定窗口下绘制资源id为IDB_BITMAP1的位图。方法如下:
1、创建兼容DC,加载指定的位图资源,将其选入到前面创建的兼容dc中
HBITMAP hbmp = ::LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
BITMAP bmpInfo;
::GetObject((HGDIOBJ)hbmp, sizeof(BITMAP), &bmpInfo);
HWND hDesktop = ::GetDesktopWindow();
HDC hDesktopDC = ::GetDC(hDesktop);
HDC hSrcDc = ::CreateCompatibleDC(hDesktopDC);
HBITMAP hSrcBitmap = ::CreateCompatibleBitmap(hDesktopDC, bmpInfo.bmWidth, bmpInfo.bmHeight);
::SelectObject(hSrcDc, hbmp);
2、创建单色掩码位图(和原图一般大小,其中原图掩码色部分为白色,其它为黑色)
::SetBkColor(hSrcDc, RGB(0xff, 0, 0xff)); // 将透明色设置为背景色
HDC hMaskDC = ::CreateCompatibleDC(hDesktopDC);
HBITMAP hMaskBmp = ::CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight, 1, 1, 0);
HBITMAP hOldMaskBmp = (HBITMAP)::SelectObject(hMaskDC, hMaskBmp);
::BitBlt(hMaskDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hSrcDc, 0, 0, SRCCOPY);
3、修改源图,使得其颜色图部分为黑色
:SetBkColor(hSrcDc, RGB(0, 0, 0));
::SetTextColor(hSrcDc, RGB(0xff, 0xff, 0xff));
::BitBlt(hSrcDc, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hMaskDC, 0, 0, SRCAND);
4、获取要绘制的窗口dc,并且进行透明绘制
HDC hdcMainWnd = ::GetDC(g_hMainWnd); // 要绘制的窗口dc
::SetBkColor(hdcMainWnd, RGB(0xff, 0xff, 0xff));
::SetTextColor(hdcMainWnd, RGB(0, 0, 0));
::BitBlt(hdcMainWnd, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hMaskDC, 0, 0, SRCAND);
::BitBlt(hdcMainWnd, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hSrcDc, 0, 0, SRCPAINT);
也就上述4个步骤。这里主要用到BitBlt的几个光栅操作。需要注意的是在BitBlt操作中,如果srcDC和dstDC的位图格式不一样的话,需要进行相应的格式转换。也就是单色位图到彩色位图的转换规则,这个看看msdn关于BitBlt的说明即可,充分利用到dstDC的前景色和背景色。这也是为啥上述代码中频繁调用SetBkColor和SetTextColor的目的所在。由于只是解释绘制原理用,几乎所有的资源都没有删除(ReleaseDC)和恢复(SelectObject等)。
相关文章推荐
- 创建掩码位图来实现透明绘图
- 创建掩码位图来实现透明绘图
- 如何实现掩码位图的透明显示
- 如何实现掩码位图的透明显示
- 如何实现掩码位图的透明显示
- 利用掩码位图实现透明显示
- 利用掩码位图实现透明显示
- 如何实现掩码位图的透明显示
- VC透明位图的实现原理
- VC 透明位图 实现透明位图类
- ios 画图 绘图的实现(自由批注中视图的subview的实现)bitmap Quartz 2D 缓存位图 自由批注功能的实现 如何实现在view上自由绘图 提供源码
- VC透明位图的实现原理
- MFC动态创建按钮,并在按钮上实现位图的切换显示
- MFC透明位图(1)--BMP的实现
- WM_ERASEBKGND消息及位图背景与透明的实现
- 实现对话框在位图作为背景时的控件透明
- VC中使用GDI函数实现位图的透明
- VC++实现位图显示透明效果
- 透明位图的实现
- ios 自由批注功能的实现 如何实现在view上自由绘图 bitmap Quartz 2D 缓存位图