  
- UID
- 2031431
- 威望
- 27 点
- 金钱
- 2 金币
- 点卡
- 10 点
|
1#
发表于 2003-9-15 04:12
| 只看该作者
[转帖]如何创建一个不规则形状的窗口
可以使用新的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函数使窗口形状看起来象一个球形体。
- void 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 ;
- }
复制代码 |
哈哈哈!!!!你的IP是不是 ?我都知道了!!! |
|