现在做了一个登录界面.是一张图片(不规则),已经实现,现在有一个问题就是,上面的Button 也是一个不规则的,但不能切除非图片区域,有代码
BOOL CDlgBmp::OnInitDialog() 
m_Test.LoadBitmap(IDB_NO1);

m_bt.SetBitmap(m_Test);    BITMAP bmtest;    m_Test.GetBitmap(&bmtest);    CRect rtWindow;
    ((CButton *)GetDlgItem(IDC_BUTTON1))->GetWindowRect(&rtWindow);
    rtWindow.right = rtWindow.left+bmtest.bmWidth;
    rtWindow.bottom =rtWindow.top +bmtest.bmHeight;
    ((CButton *)GetDlgItem(IDC_BUTTON1))->MoveWindow(&rtWindow);
CClientDC dctest(GetDlgItem(IDC_BUTTON1));    SetupRegion(&dctest,m_Test,RGB(0,0,255));........
void CDlgBmp::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
    CDC memDC;
    //创建与传入DC兼容的临时DC
    memDC.CreateCompatibleDC(pDC);
    
    CBitmap *pOldMemBmp=NULL;
    //将位图选入临时DC
    pOldMemBmp=memDC.SelectObject(&cBitmap);
    
    CRgn wndRgn;
    //创建总的窗体区域,初始region为0
    wndRgn.CreateRectRgn(0,0,0,0);
    
    
    BITMAP bit;   
    cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽     
    
    int y;
    for(y=0;y<=bit.bmHeight  ;y++)
    {
        CRgn rgnTemp; //保存临时region
        
        int iX = 0;
        do
        {
            //跳过透明色找到下一个非透明色的点.
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) == TransColor)
                iX++;
            
            //记住这个起始点
            int iLeftX = iX;
            
            //寻找下个透明色的点
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) != TransColor)
                ++iX;
            
            //创建一个包含起点与重点间高为1像素的临时“region”
            rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
            
            //合并到主"region".
            wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
            
            //删除临时"region",否则下次创建时和出错
            rgnTemp.DeleteObject();
        }while(iX <bit.bmWidth );
        iX = 0;
    }
    
    if(pOldMemBmp)
        memDC.SelectObject(pOldMemBmp);
    
    CWnd * pWnd = pDC->GetWindow();
    pWnd->SetWindowRgn(wndRgn,TRUE);    
    pWnd->SetForegroundWindow(); 

       
}

解决方案 »

  1.   

     http://hi.csdn.net/attachment/200911/19/200638_1258598364Guhh.gif已经做出来的样子,但上面的图片不知道怎么切不出去
      

  2.   

    去实现一个CButtonBmp,把按钮的区域也切成不规则的。
      

  3.   

    http://www.yesky.com/132/1895632.shtml使用这个方法做的,Dialog 
      

  4.   

    继承一个Cbutton类,在里面简单的实现自绘,然后想显示成啥样子就显示成啥样子,一段wtl的代码供你参考:
    class HyperText:
    public CWindowImpl< HyperText, CButton >,
    public CCustomDraw< HyperText >
    {
    public:    BEGIN_MSG_MAP(HyperText)
            MESSAGE_HANDLER( WM_PAINT, OnPaint )
            CHAIN_MSG_MAP_ALT( CCustomDraw< HyperText >, 1 )
            DEFAULT_REFLECTION_HANDLER()
        END_MSG_MAP()
    }void HyperText::Paint(void)
    {
    #ifdef RES_NEW_FEATER
        WTL::CPaintDC paintDC( m_hWnd );
        paintDC.SetBkMode( TRANSPARENT );    CRect rc;
        GetClientRect( rc );    CRect rtWnd;
        GetWindowRect( rtWnd );
        ATL::CWindow cwParent = GetParent();
        if( cwParent.IsWindow() )
        {
            cwParent.ScreenToClient( rtWnd );
        }    //创建内存作图对象
        WTL::CDC dc;
        dc.CreateCompatibleDC( paintDC.m_hDC );
        WTL::CBitmap memBitmap;
        memBitmap.CreateCompatibleBitmap( paintDC.m_hDC, rc.Width(), rc.Height() );
        HBITMAP hOldBmp = dc.SelectBitmap( memBitmap );    //获得控件当前使用的字体
        //如果得到NULL,则使用系统字体
        dc.SetBkMode( TRANSPARENT );    Graphics graph( dc.m_hDC );
        RectF rtf( (REAL)rc.left, (REAL)rc.top, (REAL)rc.Width(), (REAL)rc.Height() );
        StringFormat format;
        format.SetAlignment(StringAlignmentNear);
        format.SetLineAlignment( StringAlignmentCenter );
        
        SolidBrush blackBrush(m_bDrawLine?Color(255, 0, 0, 255):Color(255, 50, 50, 50));
        Font font01(HYPERTEXT_FONT);
        Font font02(HYPERTEXT_HLFONT);
        
        int nWidth = 0;
        int nHeight = 0;
        Image *pBgImg = NULL;
        QsGetImageFromFileEx(_T("ResState\\Res_Coolmart_BG.png"), pBgImg, nWidth, nHeight );    //  绘制背景图像
        if(NULL != pBgImg)
        {
            RectF rect(0,0,(Gdiplus::REAL)rc.Width(),(Gdiplus::REAL)rc.Height());
            graph.DrawImage(pBgImg, rect,6,(Gdiplus::REAL)(nHeight - 20),(Gdiplus::REAL)2, (Gdiplus::REAL)HYPERTEXT_DISTANCE, UnitPixel);
        }
        QsReleaseImageEx(pBgImg);    //  获得字符串
        if(m_nOldIndex >= (int)m_TextList.size() || NULL == m_TextList[m_nOldIndex])
        {
            return;
        }    WTL::CString strText01(m_TextList[m_nOldIndex]->szTitle);
        WTL::CString strText02(_T(""));
        
        if(m_nCurrentIndex < (int)m_TextList.size() && NULL != m_TextList[m_nCurrentIndex])
        {
            strText02 = m_TextList[m_nCurrentIndex]->szTitle;
        }
        
        int PosMask = m_bMouseDown?1:0;    if(!m_bAniMode)
        {
            if(!m_bFristRun)
            {
                RectF rtf01((REAL)rc.left, (REAL)rc.top - m_Animation + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
                graph.DrawString( strText01, strText01.GetLength(), &(m_bDrawLine?font02:font01), rtf01, &format, &blackBrush );
            }        RectF rtf02((REAL)rc.left, (REAL)rc.top - m_Animation + HYPERTEXT_DISTANCE + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
            graph.DrawString( strText02, strText02.GetLength(), &(m_bDrawLine?font02:font01), rtf02, &format, &blackBrush );
            
        }
        else
        {
            if(!m_bFristRun)
            {
                RectF rtf01((REAL)rc.left, (REAL)rc.top + m_Animation + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
                graph.DrawString( strText01, strText01.GetLength(), &(m_bDrawLine?font02:font01), rtf01, &format, &blackBrush );
            }        RectF rtf02((REAL)rc.left, (REAL)rc.top + m_Animation - HYPERTEXT_DISTANCE + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
            graph.DrawString( strText02, strText02.GetLength(), &(m_bDrawLine?font02:font01), rtf02, &format, &blackBrush );
            
        }
        paintDC.BitBlt( 0, 0, rc.Width(), rc.Height(), dc.m_hDC, 0, 0, SRCCOPY );    dc.SelectBitmap( hOldBmp );
        DeleteObject(memBitmap);
    #endif
    }
      

  5.   

    class CButtonBmp: public CDialog还是class CButtonBmp: public CButton
    ????
      

  6.   

    SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    //根据路径创建不规则窗体
    CDC* pDC; pDC = this->GetDC();
    ::BeginPath(pDC->m_hDC);

    //设置为透明模式
    ::SetBkMode(pDC->m_hDC, TRANSPARENT);
    //
    RECT rect;
    this->GetClientRect(&rect);

    pDC->MoveTo(rect.left, rect.top);
    pDC->LineTo(rect.right, rect.top); pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom - GLOBAL_OVERLEN);
    pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom);
    pDC->LineTo(rect.left + (rect.right - rect.left) / 2 - GLOBAL_OVERWIDTH, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
    pDC->LineTo(rect.left, rect.top);
    //

    ::EndPath(pDC->m_hDC);
    hRgn = ::PathToRegion(pDC->m_hDC);
    this->SetWindowRgn(hRgn, TRUE);========================================================================
    以上代码可以可以改变窗口形状 ,但下面的改变窗口中的一个Button就不行了.
    ======================================================================== SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    //根据路径创建不规则窗体
    CDC* pDC; pDC = ((CButton *)GetDlgItem(IDC_BUTTON1))->GetDC(); ::BeginPath(pDC->m_hDC);

    //设置为透明模式
    ::SetBkMode(pDC->m_hDC, TRANSPARENT);
    //
    RECT rect;
    GetDlgItem(IDC_BUTTON1)->GetClientRect(&rect);

    pDC->MoveTo(rect.left, rect.top);
    pDC->LineTo(rect.right, rect.top); pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom - GLOBAL_OVERLEN);
    pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom);
    pDC->LineTo(rect.left + (rect.right - rect.left) / 2 - GLOBAL_OVERWIDTH, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
    pDC->LineTo(rect.left, rect.top);
    //

    ::EndPath(pDC->m_hDC);
    hRgn = ::PathToRegion(pDC->m_hDC); ((CButton *)GetDlgItem(IDC_BUTTON1))->SetWindowRgn(hRgn, TRUE);
      

  7.   

    我都不知道要说什么好了……1.很显然要派生自CButton
    2.实现CButtonBmp的代码中居然会出现GetDlgItem的函数?有没有搞错?算了,你还是直接看别人源码吧
    http://www.codeproject.com/KB/buttons/cxskinbutton.aspx
      

  8.   


    没有在派生类里,是在button所在的类里.  :-(   谢谢.....