MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn

Posted 晴堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn相关的知识,希望对你有一定的参考价值。

Windows中所有窗口显示默认为矩形,很多时候我们希望窗口的形状可以随意变化。这个时候我们就需要使用MFC的CRgn类,

每一个窗口都有一个自己的CRgn,定义了当前窗口的显示区域,CRgn就好像是在一张图片上添加了相框,相框的形状就决定了

窗口的显示范围。当然显示区域之外就属于其他窗口。


一,多边形窗口

        CRect rc; 
	GetWindowRect(&rc); //获取窗口矩形(大小)

	CPoint ptVertex[4]; //多边形顶点数组,形状为平行四边形
	ptVertex[0].x = 0 ;  
	ptVertex[0].y = rc.Height();
	ptVertex[1].x = rc.Width()/2;
	ptVertex[1].y = rc.Height();
	ptVertex[2].x = rc.Width();
	ptVertex[2].y =0;
	ptVertex[3].x = rc.Width()/2;
	ptVertex[3].y = 0;

	CRgn m_rgn;   //定义窗口显示区域
	m_rgn.CreatePolygonRgn(ptVertex,4,ALTERNATE);//根据顶点数组创建窗口的显示区域

	SetWindowRgn(m_rgn,TRUE);//添加到当前窗口
代码直接放在OnInitDialog()方法里,修改顶点就可以了,其中第一个点和最后一个点会自动连接。


二,根据图片定义窗口

        COLORREF TransColor=RGB(255,255,255);//白色为不显示的部分
        CBitmap cBitmap;
	cBitmap.LoadBitmap(IDB_BITMAP_CRGN);//加载描述窗口形状的BMP图片
	CDC* pDC=this->GetDC();
	CDC memDC;//为什么要创建,是不是可以直接设置当前控件的CRgn
	memDC.CreateCompatibleDC(pDC);//创建与传入DC兼容的临时DC
	CBitmap *pOldMemBmp=NULL;
	pOldMemBmp=memDC.SelectObject(&cBitmap);//将位图选入临时DC,方便对图片在控件环境中进行操作
	static CRgn wndRgn;
	wndRgn.CreateRectRgn(0,0,0,0);//创建总的窗体区域,初始region为0
	BITMAP bit;
	cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
	int y;
	CRgn rgnTemp; //保存临时region
	for(y=0;y<=bit.bmHeight ;y++)
	
		int iX = 0;
		do
		
			//跳过透明色找到下一个非透明色的点.
			while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
				iX++;
			//记住这个起始点
			int iLeftX = iX;
			//寻找下个透明色的点
			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();
代码直接放在OnInitDialog()方法里,修改要载入的图片就可以了,图片可以是24位也可以是32位。

我的图片:



程序窗口:



以上是关于MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn的主要内容,如果未能解决你的问题,请参考以下文章

在MFC怎么中设置窗口大小和位置?

自定义 MFC 窗口/对话框可以是类模板实例化吗?

Png异形窗口

在MFC里面添加个自定义控件,为啥程序自动退出,不显示窗口等待用户操作了?

Delphi笔记-自定义提示窗口

在dockframe窗口上添加自定义LISTBOX