Visual C++ 7.1Visual Studio 6Visual C++ 7.0Visual Studio .NET 2003Visual C++ 6.0MFC中级开发Visual StudioWindowsC++
CContourBitmap - 一个区域创建器






4.60/5 (21投票s)
一个带有“蛮力”区域创建器的位图类
引言
几周前,我正在寻找一种方法,从具有用户定义的透明颜色的位图中创建不规则形状的窗口。我找到的 MFC 示例,在处理封闭的透明区域时存在一些问题。因此,我决定自己设计一个解决方案。
背景
CContourBitmap
使用一种非常简单但可靠的“蛮力”算法,从具有用户定义的透明颜色的位图中计算区域。它从位图尺寸给定的矩形区域开始,然后逐行扫描位图。找到的每个“透明”行部分,都会从位图的区域中减去,从而得到一个新的位图区域。
下面是演示应用程序主窗口的(缩减)截图。(好吧,版权声明是后来添加的。)但正如你所看到的,CContourBitmap
对凸形或凹形形状或完全封闭的透明区域都没有问题。
使用代码
CContourBitmap
提供两种不同的方法来从位图中计算区域
HRGN CContourBitmap::CreateRegion(COLORREF colorTransp=CLR_DEFAULT)使用此函数显式指定透明颜色。(或者使用默认颜色,即左上角像素的颜色。)
HRGN CContourBitmap::CreateRegion(CPoint pntTransparentColor)使用此函数从图像中的任何像素中提取透明颜色。(如果像素位于位图之外,则返回值为空。)
除了这些方法之外,还有两个其他有用的函数来简化位图处理
CSize CContourBitmap::GetSize()返回位图的尺寸。
BOOL CContourBitmap::Paint(CDC* pDC, int nXDest=0, int nYDest=0)将位图与可选的偏移量复制到给定的设备上下文中。
关注点
CContourBitmap
派生自 CBitmap
。它没有向基类添加任何属性。因此,将 CBitmap
转换为 CContourBitmap
是安全的。
已知bug
在具有 16 位颜色深度的 Windows 桌面中指定 24 位透明颜色可能无法正常工作。需要从 24 位颜色空间转换为 16 位颜色空间。
法律版权
Pink Panther TM & (C) 1964 by Metro-Goldwyn-Mayer Studios, Inc.
历史
- 2004-07-07 初始发布