发信人: skyice() 
整理人: supermario(1999-11-10 07:31:54), 站内信件
 | 
 
 
可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口
 的一个指定的区域,实际上使窗口成为指定的不规则形状。使用AppWizard
 创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺
 省控件、标题以及边界。
 给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。
 Class CRoundDlg : public CDialog
 {
 …
 private :
 Crgn m_rgn : // window region
 …
 } ;
 修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分
 配给窗口:
 BOOL CRoundDlg : : OnInitDialog ( )
 {
 CDialog : : OnInitDialog ( ) ;
 //Get size of dialog .
 CRect rcDialog ;
 GetClientRect (rcDialog );
 // Create region and assign to window .
 m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width ( ) ,
        rcDialog .Height ( ) );
 SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn , TRUE );
 return TRUE ;
 }
 通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下
 面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。
 voik CRoundDlg : : OnPaint ( )
 {
 CPaintDC de (this) ; // device context for painting .
 //draw ellipse with out any border
 dc. SelecStockObject (NULL_PEN);
 //get the RGB colour components of the sphere color
 COLORREF color= RGB( 0 , 0 , 255);
 BYTE byRed =GetRValue (color);
 BYTE byGreen = GetGValue (color);
 BYTE byBlue = GetBValue (color);
 // get the size of the view window
 Crect rect ;
 GetClientRect (rect);
 // get minimun number of units
 int nUnits =min (rect.right , rect.bottom );
 //calculate he horiaontal and vertical step size
 float fltStepHorz = (float) rect.right /nUnits ;
 float fltStepVert = (float) rect.bottom /nUnits ;
 int nEllipse = nUnits/3; // calculate how many to draw
 int nIndex ; // current ellipse that is being draw
 CBrush brush ; // bursh used for ellipse fill color
 CBrush *pBrushOld; // previous brush that was selected into dc
 //draw ellipse , gradually moving towards upper-right corner
 for (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++)
 {
 //creat solid brush
 brush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).
 ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) )  );
 //select brush into dc
 pBrushOld= dc .SelectObject (&brhsh);
 //draw ellipse
 dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,
 rect. right -( (int) fltStepHorz * nIndex )+ 1,
 rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ;
 //delete the brush
 brush.DelecteObject ( );
 }
 }
 最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。
 UINT CRoundDlg : : OnNchitTest (Cpoint point )
 {
 //Let user move window by clickign anywhere on the window .
 UINT nHitTest = CDialog : : OnNcHitTest (point) ;
 rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest ;
 }
  -- 欢迎您光临程序员之家!
 http://skyline.t500.net  http://skyice.126.com
 http://skyice.chn.net    http://skyice.in-china.com
 http://skysnow.yeah.net  http://skyline.pcchina.net
 请您多多关照!
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.82.5]
  | 
 
 
 |