如何制作不规则窗体?

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3114/3114836.xml?temp=.4848902
      

  2.   

    http://www.vckbase.com/code/findcode.asp?keyword=%B2%BB%B9%E6%D4%F2%B4%B0%CC%E5
      

  3.   

    创建一个不规则形状的窗口 
     
    可以使用新的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 ;

     
      

  4.   

    呵呵,这样的代码太多了,我有一堆,什么形状的都有呵呵留下mail或者给我发消息,我都发给你好了,还有一些资料^_^
      

  5.   

    呵呵,这样的代码太多了,我有一堆,什么形状的都有呵呵留下mail或者给我发消息,我都发给你好了,还有一些资料^_^
      

  6.   

    这里有一个工具可以实现
     软件造型师 V1.1 根据任意常用BMP文件生成各种形状的窗口模板,可以在VC,VB,DELPHI中使用http://www.vckbase.com/tools/downtools.asp?id=38