当前位置:C++技术网 > 资讯 > SelectClipRgn函数实现在不规则区域上绘制图形

SelectClipRgn函数实现在不规则区域上绘制图形

更新时间:2016-05-05 21:50:10浏览次数:1+次

    昨天研究播放器的时候,遇到这样个问题:我在创建了自定义的按钮后,想要给按钮铺上图片。对于系统提供的按钮,我们直接创建一个CBitmapButton类的对象就可以啦。可是,这是我们自定义的按钮,我们好像不能从这个方面入手。那么还有没有别的办法?有!那就是剪切区!
在这里说一下,百度查这个函数的时候,真是坑!一个个尽是扯淡,也就几个是自己做的实例,是自己写的程序里的一个片段代码。也说明这个人是真的用上了这个函数。可是有的人直接就是贴百度百科里的东西,尽是些理论——扯淡!误人子弟!在这里,我鄙视那些人。说完了自己查资料时候的感受,下面进入正题!
对于剪切区呢,请参考本站大神codexia《GDI中的剪切区域的设置和使用代码详解》写的系列文章。
我们一旦定义创建了一个区域对象,并规定了范围的话,相当于取代了原本的对话框客户区,那么,我们现在如果在进行绘图操作,就是在我们的剪切区上进行了。这就是我要说的重点,也是本文的程序的中心点。

下面我们看个代码:

CDC	*pDC = GetDC();
		if(m_hBmp != NULL)
		{
			//添加的代码:
			HRGN c;
			HRGN r1;
			c = CreateRectRgn(108, 100, 155, 131);
			r1 = CreateEllipticRgn(148, 108, 100+15 + 48, 100+15 + 8);
			CombineRgn(c, c, r1, RGN_OR);
			SelectClipRgn(pDC->GetSafeHdc(),c);
			//到此为止


			CBitmap bmp;				//定义一个位图对象
			bmp.Attach(m_hBmp);		//将位图句柄关联到位图对象上
			CDC memDC;				//定义一个设备上下文
			memDC.CreateCompatibleDC(pDC);		//创建兼容的设备上下文
			memDC.SelectObject(&bmp);		//选中位图对象
			BITMAP BitInfo;				//定义位图结构
			bmp.GetBitmap(&BitInfo);			//获取位图信息
			int x = BitInfo.bmWidth;		//获取位图宽度
			int y = BitInfo.bmHeight;				//获取位图高度
			pDC->BitBlt(10, 50, x, y, &memDC, 0, 0, SRCCOPY);//向窗口中绘制位图
			bmp.Detach();					//分离位图句柄
			memDC.DeleteDC();					//释放设备上下文对象
		}
这段代码是《学习心得之八------实现从磁盘读入图片文件》只是添加了几句代码而已!

下面是实现结果:

上图是没有添加代码的实现结果!对比下不同......

那么我问你,如何在自定义的按钮上铺上图片呢?参考本文,自己实现看看!