MFC——改变窗口外形
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);//添加到当前窗口
二,根据图片定义窗口
- 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();
我的图片:
程序窗口: