|   
 UID2031431 威望27 点 金钱2 金币 点卡10 点 
 | 
 [转帖]如何创建一个不规则形状的窗口
| 可以使用新的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 borderdc. SelecStockObject (NULL_PEN); //get the RGB colour components of the sphere colorCOLORREF color= RGB( 0 , 0 , 255);BYTE byRed =GetRValue (color);BYTE byGreen = GetGValue (color);BYTE byBlue = GetBValue (color); // get the size of the view windowCrect rect ;GetClientRect (rect); // get minimun number of unitsint nUnits =min (rect.right , rect.bottom ); //calculate he horiaontal and vertical step sizefloat fltStepHorz = (float) rect.right /nUnits ;float fltStepVert = (float) rect.bottom /nUnits ; int nEllipse = nUnits/3; // calculate how many to drawint nIndex ; // current ellipse that is being draw CBrush brush ; // bursh used for ellipse fill colorCBrush *pBrushOld; // previous brush that was selected into dc //draw ellipse , gradually moving towards upper-right cornerfor (nIndex = 0 ; nIndes < + nEllipse ; nIndes ++){//creat solid brushbrush . CreatSolidBrush (RGB ( ( (nIndex *byRed ) /nEllipse ).( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) /nEllipse ) ) ); //select brush into dcpBrushOld= dc .SelectObject (&brhsh); //draw ellipsedc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,rect. right -( (int) fltStepHorz * nIndex )+ 1,rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ; //delete the brushbrush.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是不是  ?我都知道了!!! |  |