SetWindowRgn()函数可以设定窗口的多种边界剪切域,而不是像SetWindowRect只能设置矩形的外包边界。
先用一个简单的实例直观的说明。
1、 用MFC的向导工具建立一个对话框工程,工程名为ShapedWindow1。
2、 在对话框类中增加窗口区域的数据成员
class CShapedWindow1Dlg : public CDialog { … private: CRgn m_rgn;//window region … };
3、 修改OnInitDialog()函数,建立一个圆角矩形区域,再调用SetWindowRgn()函数将区域分配给对话框。
BOOL CShapedWindow1Dlg::OnInitDialog() {… // 创建圆角矩形区域 CRect rc; // rounded rectangle GetWindowRect(&rc); // window rect in screen coordsm_rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom, 50,50); // rounded rect w/50 pixel corners //设置这个区域 SetWindowRgn(m_rgn,TRUE); // set window region to make rounded window return TRUE; // 除非将焦点设置到控件,否则返回TRUE }
4、 编译运行程序,就可以完成一个最简单的圆角矩形窗口。(如图1)
这样一个简单的圆角矩形的对话框就完成了!
5、 下面让我们更近一步,创建更多不同的异形窗口。
利用CRgn类中的成员函数可以创建椭圆形、多边形和其它一些复杂的图形的窗口。
这里只介绍几种简单的异性窗口创建。
将上面3步骤中的代码行替换成不同的区域形状。
//替换的代码行 m_rgn.CreateRoundRectRgn(rc.left,rc.top,rc.right,rc.bottom, 50,50); // rounded rect w/50 pixel corners
依次换成以下的代码。
//椭圆形替换代码 m_rgn.CreateEllipticRgn(rc.left,rc.top,rc.right,rc.bottom); //多边形替换代码 //多边形的点的数组 CPoint ptVertex[5]; ptVertex[0].x = rc.left ; ptVertex[0].y = rc.bottom; ptVertex[1].x = rc.right; ptVertex[1].y = rc.bottom; ptVertex[2].x = rc.right; ptVertex[2].y = (rc.top+rc.bottom)/2; ptVertex[3].x = (rc.right+rc.left)/2; ptVertex[3].y = rc.top; ptVertex[4].x = rc.left; ptVertex[4].y = (rc.top+rc.bottom)/2;m_rgn.CreatePolygonRgn(ptVertex,5,ALTERNATE);
就可以实现椭圆形和多边形的异形窗口了。
6、 关于其它复杂图形可以参考MSDN的CRgn类中不同成员函数的说明,或者API的说明。
7、 注意:这里面使用的函数都是在CWnd类(CDialog类的父类)中的成员函数,而在Window GDI中也有API类似的函数,它们的拼写和参数列表都相同或相近。请不要用错。我在学习时候,搜索到一篇被广泛转载的文章。错误很多,其中一个就如下:
SetWindowRgn (GetSafeHwnd () , (HRGN) m_ rgn,TRUE );
这行代码编译的时候是不能通过的。从参数列表上看,这个函数是Window GDI中的函数。所以应该调用如下:
::SetWindowRgn (GetSafeHwnd () , (HRGN) m_rgn,TRUE );
加“:: ”域操作符调用的才是API函数,否则调用的是CWnd类(CDialog类的父类)中的成员函数,这样的话参数列表有不正确了。
调用成员函数的代码如下:
SetWindowRgn ( (HRGN) m_rgn,TRUE );
源代码下载链接:http://download.csdn.net/source/2301447
结束总结:
使用SetWindowRgn()函数创建异形窗口,首先创建一个CRgn对象,保存窗口形状的信息。
然后调用SetWindowRgn()函数设置成窗口边界剪切域。
转帖:http://blog.csdn.net/jean7155/article/details/5544357