MFC不规则窗体

51 篇文章 3 订阅

//效果截图如下(文后提供本例子的VS2008工程下载)

------------------------------------------------------------------------------------------------------------------------------------------------- ---

关于边边有杂色的问题,是因为边边的颜色和要透明的颜色不一样,只要用PS

将边边的颜色弄成和要透明的颜色一样就可以了,CF登陆窗口的背景图弄的就非常好,

这就看亲的PS功底了。

------------------------------------------------------------------------------------------------------------------------

主要代码如下:

//CDC *pDC, //窗体的DC指针
//CBitmap &cBitmap, //含有窗体形状的位图对象
//COLORREF TransColor //透明色
void CIrregularWndDlg::SetupRegionCDC(CDC * pDC, CBitmap & cBitmap, COLORREF TransColor)
{
	//本函数只调用一次即可,不然窗口会闪哦
	static int nExit=1;
	if (nExit>1)
	{
		return;
	}
	nExit++;

	CDC memDC;//创建与传入DC兼容的临时DC
	memDC.CreateCompatibleDC(pDC);
	CBitmap *pOldMemBmp = NULL;//将位图选入临时DC
	pOldMemBmp = memDC.SelectObject(&cBitmap);

	static CRgn wndRgn;//创建总的窗体区域,初始region为0
		wndRgn.CreateRectRgn(0, 0, 0, 0);

	BITMAP bit;
	cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽

	//逐个扫描图片的每个像素,如这个像素不属于透明色,
	//则在相应位置创建一个只含一个像素的region,然后将这些小region
	//合并起来组成一个任意形状的region
	int y;
	CRgn rgnTemp; //保存临时region	
	for(y = 0; y <= bit.bmHeight ; y++)
	{	
		int iX = 0;
		do
		{
			  //在图片的第y行寻找第一个非透明色的点
			  while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
						iX++;
			  int iLeftX = iX;//记住这个起始点

				//在图片的第y行寻找第一个透明色的点
				while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
						++iX;

				//创建一个包含起点与终点间高为1像素的临时“region”
				rgnTemp.CreateRectRgn(iLeftX, y, iX, y + 1);
				

				//合并到主"region".
				wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);

				//删除临时"region",否则下次创建时会出错
				rgnTemp.DeleteObject();
		  }
		  while(iX<= bit.bmWidth); 
	}

		  this->SetWindowRgn(wndRgn, TRUE);
		  memDC.DeleteDC();
	}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

本例子VS2008工程下载:

http://download.csdn.net/detail/friendan/6202163    //MFC不规则窗体.zip

---------------------------------------------------------------------------------------------------------------------------------

您的十分满意是我追求的宗旨。

您的一点建议是我后续的动力。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值