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

 

 

 

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类另外一个极其重要的函数�D�DCombineRgn()。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 );
......
 

你可能感兴趣的:(CRgn类和SetWindowRgn()函数实现不规则的窗口)