如果窗体是对话框的话,那么就可以对话框的OnInitDialog函数中建立一个RGN,然后用SetWindowRgn设定窗体的形状比如:
class CMyDialog : public CDialog
{
private:
   CRgn m_MainRgn;
   ………………
};
………………void CMyDialog::OnInitDialog()
{
   
   …………………………   CRect m_Rect;
   GetClientRect(&m_Rect);
   m_MainRgn.CreateEllipeRgn(0,0,m_Rect.Width(),m_Rect.Height());
   SetWindowRgn(m_MainRgn,TRUE);
   …………………………
}这一段代码的作用是创建一个椭圆形的窗体

解决方案 »

  1.   

    你找着AnyForm或者BitmapRegion可以从bitmap生成Rgn
      

  2.   

    如何创建一个不规则形状的窗口
     
    可以使用新的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 thewindow .
     UINT nHitTest = CDialog : : OnNcHitTest (point)
     rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest
     }