送分!分享圆角按钮解决办法

送分!分享圆角按钮
方案:
重写虚函数DrawItem
先创一个圆角矩型CreateRoundRectRgn.
然后把按钮区域设置在刚建的圆角矩型区域内SetWindowRgn.
最后把按钮画出来RoundRect.
其中,
函数 SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,可以是CreateRectRgn(),CreatePolyRgn(),CreatePolygonRgn(),CreateRoundRectRgn()和 CreateEllipticRgn(),等.
C/C++ code
#pragma once


// CCustomButton

class CCustomButton : public CButton
{
    DECLARE_DYNAMIC(CCustomButton)

public:
    CCustomButton();
    virtual ~CCustomButton();

protected:
    DECLARE_MESSAGE_MAP()
public:
//    afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
public:
    BOOL m_IsPressed;//鼠标是否按下
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    CBrush m_Brush;
    virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
};

C/C++ code
CCustomButton::CCustomButton()
{
    m_IsPressed = FALSE;
}

重写虚函数
C/C++ code
void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{

    // TODO:  添加您的代码以绘制指定项
        CRect rect;
    //GetClientRect(&rect);
//得到原先按扭区域
    rect = lpDrawItemStruct->rcItem;
    CDC dc;
//连接到设备环境,(我喜欢称设备上下文为设备环境)
    dc.Attach(lpDrawItemStruct->hDC);

    m_Brush.CreateStockObject(NULL_BRUSH);
    dc.SelectObject(&m_Brush);
    if(m_IsPressed)//鼠标按下
    {
        CPen pen(PS_SOLID,2,RGB(255,100,0));
//选择画笔
        dc.SelectObject(&pen);
//创建圆角矩型
        HRGN h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
//设置按钮区域
        SetWindowRgn(h_rgn,TRUE);
//圆出按钮
        dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
        dc.SetTextColor(RGB(255,100,0));
    }
    else//鼠标没有按下
    {
        CPen pen(PS_SOLID,2,RGB(198,198,198));
        dc.SelectObject(&pen);
        HRGN h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
        SetWindowRgn(h_rgn,TRUE);
        dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height());
        dc.SetTextColor(RGB(255,100,0));
    }

    CString str;
    GetWindowText(str);
//写上文本
    dc.DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
删除设备环境
    dc.DeleteDC();

}


响应鼠标
C/C++ code

void CCustomButton::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    m_IsPressed = FALSE;

    CButton::OnLButtonUp(nFlags, point);
}

BOOL CCustomButton::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值


    return CButton::OnEraseBkgnd(pDC);
}


这里要注意的地方就是DrawItem是虚函数,而不是消息OnDrawItem.
另外要将OwnerDraw设为true;

------解决方案--------------------
学习
回复内容 回复内容太短了! 
回复内容 回复太快,请先休息一下!
------解决方案--------------------
接分。。。
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
楼主是做界面工作的吗?
------解决方案--------------------
分享的统统要顶起学习
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
有分 必须接
------解决方案--------------------