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的主要内容,如果未能解决你的问题,请参考以下文章