65.9K
CodeProject 正在变化。 阅读更多。
Home

CContourBitmap - 一个区域创建器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (21投票s)

2004年7月7日

CPOL

2分钟阅读

viewsIcon

80005

downloadIcon

3304

一个带有“蛮力”区域创建器的位图类

引言

几周前,我正在寻找一种方法,从具有用户定义的透明颜色的位图中创建不规则形状的窗口。我找到的 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 初始发布
© . All rights reserved.