VC++中提供了CRgn类和SetWindowRgn函数来创建别具一格的窗口。创建一个新窗口首先要定义一个CRgn对象,并用各种初始化函数创建CRgn类的区域,然后调用CWnd:: SetWindowRgn函数创建不规则窗口。
CRgn类是从CGdiObject类派生二来的子类,CRgn类用来确定一个多边形、椭圆形或由多边形和椭圆合成的图形范围。CRgn类有三个比较常用的成员函数。
1、CreateRectRgnIndirect
该函数用来创建一个矩形区域,原型为:
CreateRectRgnIndirect(LPCRECT lpRect);
参数lpRect用来指定待创建的矩形区域在窗口客户区中的坐标。
2、CreateEllipticRgnIndirect函数
该函数用来创建一个椭圆区域,原型为:
CreateEllipticRgnIndirect(LPCRECT lpRect);
参数lpRect用来指定待创建的椭圆区域在窗口客户区中的坐标。如果参数lpRect的right坐标和left坐标的差等于button坐标与top坐标的差,那么所创建的区域为一个圆形区域。
3、CreatePolygonRgn函数
该函数用来创建一个多边形区域,原型为:
CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode);
参数lpPoints为一个指向POINT结构的数组指针。在POINT结构数组中,每个POINT结构项用来确定多边形顶点在窗口用户区中的坐标。参数nCount用于指定POINT结构数组中结构项的数目,也就是多边形的顶点数。而nMode用于指定多边形的填充方式,通常取值为ALTERNATE。下面一段代码用于创建一个三角形区域:
CRect rcDialog;
GetClientRect(rcDialog);
Points[0].x = rcDialog.Width()/2;
Points[0].y = 0;
Points[1].x = rcDialog.Width();
Points[1].y = rcDialog.Height();
Points[2].x = 0;
Points[2].y = rcDialog.Height();
m_rgn.CreatePolygonRgn(Points,3,ALTERNATE);
::SetWindowRgn(GetSafeHwnd(),(HRGN)m_rgn,TRUE);
利用上述语句创建了一个区域之后,接下来就可以调用CWnd::SetWindowRgn函数来创建窗口了。该函数原型为:
CWnd::SetWindowRgn(HRGN hRgn, BOOL bRedraw);
其中参数hRgn为一个已经创建的CRgn类的句柄;参数bRedraw如果设置为TRUE,则在窗口次序发生变化时,系统向窗口发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息用于重绘窗口。
如果要创建更复杂的窗口,则可以通过CombineRgn函数把几个非矩形区域结合起来,该函数原型为:
CombineRgn(CRgn* pRgn1,CRgn* pRgn2, int nCombineMode);
其中,参数pRgn1和pRgn2分别指向参与合成的不规则区域;参数nCombineMode用于指定结合的方式:
* RGN_AND :表示最后形成的区域是pRgn1和pRgn2的重叠部分;
* RGN_DIFF :表示最后形成的区域是pRgn1中不包含pRgn2的部分;
* RGN_OR :表示最后形成的区域同时包含pRgn1和pRgn2;
* RGN_XOR :表示最后形成的区域同时包含pRgn1和pRgn2,但不包含重叠部分。