实现不规则窗体------基于MFC based DLG(二)

2014-11-24 10:23:15 · 作者: · 浏览: 1
后对IDB_MASK图像的像素信息进行一列一列的枚举,计算出每列中不设为透明的区域,然后跟crRgn合并,所以最后的crRgn就是所要设定的区域。

核心代码为:

[cpp]
CRgn crRgn, crRgnTmp;
//创建一个空区域
crRgn.CreateRectRgn(0, 0, 0, 0);

int iX = 0;int iY = 0;
for (iY = 0; iY < bit.bmHeight; iY++)
{
do
{
//skip over transparent pixels at start of lines.
//以一个相素列为单位,找到在这一个相素列中,第一个不是要设为透明相素的点iX。
//然后再找到以这个iX为起点的,在这个一个相素列中最后跟他临近的最后一个不是透明的点。
//然后将他们一起合并到crRgn中。

while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) == TransColor)
iX++;//在iY和iY+1这个相索列中,第一个不设为透明的点的X坐标
int iLeftX = iX;//保存这个点的坐标
while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) != TransColor)
++iX;//这是找到在iX最临近的不透明的X坐标
crRgnTmp.CreateRectRgn(iLeftX, iY, iX, iY+1);//这四个点连在一起就是现在刚找到的不透明的区域
//合并区域
crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_OR);
//记得最终要手动删除crRgnTmp对象
crRgnTmp.DeleteObject();
}while(iX < bit.bmWidth);//如果iX没有达到图片的末尾,说明还没有枚举完这一行,则在iY和iY+1这个行上,进行下一轮的//枚举
iX = 0;
}