MFC——改变窗口外形

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

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

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


一,多边形窗口

[cpp] view plain copy
  1.        CRect rc;   
  2. GetWindowRect(&rc); //获取窗口矩形(大小)  
  3.   
  4. CPoint ptVertex[4]; //多边形顶点数组,形状为平行四边形  
  5. ptVertex[0].x = 0 ;    
  6. ptVertex[0].y = rc.Height();  
  7. ptVertex[1].x = rc.Width()/2;  
  8. ptVertex[1].y = rc.Height();  
  9. ptVertex[2].x = rc.Width();  
  10. ptVertex[2].y =0;  
  11. ptVertex[3].x = rc.Width()/2;  
  12. ptVertex[3].y = 0;  
  13.   
  14. CRgn m_rgn;   //定义窗口显示区域  
  15. m_rgn.CreatePolygonRgn(ptVertex,4,ALTERNATE);//根据顶点数组创建窗口的显示区域  
  16.   
  17. SetWindowRgn(m_rgn,TRUE);//添加到当前窗口  
代码直接放在OnInitDialog()方法里,修改顶点就可以了,其中第一个点和最后一个点会自动连接。


二,根据图片定义窗口

[cpp] view plain copy
  1.        COLORREF TransColor=RGB(255,255,255);//白色为不显示的部分  
  2.        CBitmap cBitmap;  
  3. cBitmap.LoadBitmap(IDB_BITMAP_CRGN);//加载描述窗口形状的BMP图片  
  4. CDC* pDC=this->GetDC();  
  5. CDC memDC;//为什么要创建,是不是可以直接设置当前控件的CRgn  
  6. memDC.CreateCompatibleDC(pDC);//创建与传入DC兼容的临时DC  
  7. CBitmap *pOldMemBmp=NULL;  
  8. pOldMemBmp=memDC.SelectObject(&cBitmap);//将位图选入临时DC,方便对图片在控件环境中进行操作  
  9. static CRgn wndRgn;  
  10. wndRgn.CreateRectRgn(0,0,0,0);//创建总的窗体区域,初始region为0  
  11. BITMAP bit;  
  12. cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽  
  13. int y;  
  14. CRgn rgnTemp; //保存临时region  
  15. for(y=0;y<=bit.bmHeight ;y++)  
  16. {  
  17.     int iX = 0;  
  18.     do  
  19.     {  
  20.         //跳过透明色找到下一个非透明色的点.  
  21.         while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)  
  22.             iX++;  
  23.         //记住这个起始点  
  24.         int iLeftX = iX;  
  25.         //寻找下个透明色的点  
  26.         while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)  
  27.             ++iX;  
  28.         //创建一个包含起点与重点间高为1像素的临时“region”  
  29.         rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);  
  30.         //合并到主"region".  
  31.         wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);  
  32.         //删除临时"region",否则下次创建时和出错  
  33.         rgnTemp.DeleteObject();  
  34.     }while(iX<bit.bmWidth);  
  35. }  
  36. this->SetWindowRgn(wndRgn,TRUE);  
  37. memDC.DeleteDC();  
 代码直接放在OnInitDialog()方法里,修改要载入的图片就可以了,图片可以是24位也可以是32位。

我的图片:

MFC——改变窗口外形

程序窗口:

MFC——改变窗口外形