hur.cn - 华软网

 热门搜索

[Help]如何显示圆角(非默认尖角)Button按纽?

  作者:未知    来源:网络    更新时间:2011/1/10
下面的代码能够用来设置圆角窗体,
然则不知道如何设置圆角的Button,
请熟悉的朋友介绍下,谢谢。。。

C++">//设置圆角窗体
CRect rect;
GetClientRect(&rect);

HRGN rgn;
rgn = CreateRoundRectRgn(0,0,rect.Width()+5,rect.Height(),30,30);
SetWindowRgn(rgn,TRUE);

---华软 网友回答---
  class="deleted_message"> 该回复于2011-01-10 09:46:57被版主删除
---华软网友回复---
重写虚函数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++ codeCCustomButton::CCustomButton()
{
    m_IsPressed = FALSE;
}

重写虚函数
C/C++ codevoid 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;
---华软网友回复---
原理是一样的
重载按钮调用SetWindowRgn
---华软网友回复---
http://topic.csdn.net/u/20100813/16/dceaf5c6-bc9a-4aa7-abce-28963a313a38.html
---华软网友回复---
  class="deleted_message"> 该回复于2011-01-11 10:38:57被版主删除        
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。