如何创建不规则窗口

时间:2022-02-22 23:28:04

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,但不包含重叠部分。