如何创建不规则窗口
2007-09-10 11:05
260 查看
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,但不包含重叠部分。
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,但不包含重叠部分。
相关文章推荐
- 如何创建一个不规则形状的窗口
- 如何创建一个不规则形状的窗口收藏
- MFC如何在父窗口的指定位置创建子窗口,及border边框属性设置
- MFC(8) 如何在工作线程中创建窗口?
- Android 窗口是如何创建的?
- 如何创建一个用户看不到的窗口。
- 【原】创建 WPF 不规则窗口
- 如何使用UGUI创建制作不规则按钮
- 如何实现一个不规则形状的WPF窗口
- 创建一不规则窗口
- 自定义不规则窗口如何响应左双击事件
- 纯属抄袭 -- SWT如何实现不规则窗口
- swt创建不规则窗口
- windows mobile 1.如何真正的退出程序而不隐藏窗体。2.让窗体跟着输入法窗口上移。3.如何创建非全屏Form
- VC++如何创建无CMD窗口控制台程序
- 如何创建一个用弹出窗口来查看详细信息的超链接列
- 如何通过掩码图创建不规则的显示效果的图片(clip图片)
- 用Win32 API创建不规则窗口
- 如何创建一个用弹出窗口来查看详细信息的超链接列
- 如何使用SetWindowRgn函数创建异形窗口