您的位置:首页 > 其它

CRgn类和SetWindowRgn()函数实现不规则的窗口

2012-10-06 22:14 387 查看

1 创建一个不规则窗口的过程是:首先定义一个CRgn类,并用各种初始化函数创建CRgn类的具体区域

2然后调用CWnd::SetWindowRgn()函数创建不规则窗口。

CRgn用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到CreateRectRgnIndirect()CreateEllipticRgnIndirect()CreatePolygonRgn()三个函数。如CreateRectRgnIndirect(LPCRECTlpRect)函数创建一个矩形区域,参数lpRect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。例如:CRgn MyRgn;RECT m_rect;m_rect.left=0;m_rect.top=0; m_rect.right=500; m_rect.bottom=300;MyRgn.CreateRectRgnIndirect( &m_rect );

利用以上的函数创建区域后,就可以调用CWnd::SetWindowRgn(HRGN hRgn, BOOL

bRedraw)来创建非矩形的窗口了。SetWindowRgn()函数参数说明:hRgn是一个CRgn类的句柄;bRedraw如果被设置成TRUE,那么,在窗口次序发生变化时,系统会发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息给窗口。

如果要创建外形更复杂的窗口,例如mp3播放器Soniq的一个播放界面,就是两个圆形部分重合形成的。对于这类窗口的创建,还要用到CRgn类另外一个极其重要的函数――CombineRgn()。CombineRgn(CRgn* pRgn1, CRgn* pRgn2, intnCombineMode)函数用来创建一个由多个多边形、椭圆合成的不规则区域。pRgn1、pRgn2分别指向参与合成不规则区域的多边形或椭圆形;nCombineMode说明合成的方式:RGN_AND最后的区域是pRgn1和pRgn2的重叠部分;RGN_DIFF最后的区域是pRgn1中不包含pRgn2的部分;RGN_OR最后的区域同时包含pRgn1和pRgn2;RGN_XOR最后的区域同时包含pRgn1和pRgn2,但不包含pRng1和pRng2重叠的部分。例如,创建一个类似Soniq播放器的界面:

......

RECT m_Cyc1;

RECT m_Cyc2;

CRgn RgnCyc1;

CRgn RgnCyc2;

CRgn RgnDlg;

m_Cyc1.left=100; m_Cyc1.top=5; m_Cyc1.right=200; m_Cyc1.bottom=105;

m_Cyc2.left=80; m_Cyc2.top=85; m_Cyc2.right=180; m_Cyc2.bottom=185;

RgnDlg.CreateEllipticRgnIndirect( &m_Cyc1 );

RgnCyc1.CreateEllipticRgnIndirect( &m_Cyc1 );

RgnCyc2.CreateEllipticRgnIndirect( &m_Cyc2 );

RgnDlg.CombineRgn( &RgnCyc1, &RgnCyc2, RGN_OR );

MyWin.SetWindowRgn( (HRGN)RgnDlg, TURE );

......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息