MFC 按鈕如何改變顏色


 我們發現想改變對話框的背景顏色是很簡單的,但是對話框的背景顏色改變了后,我們發現按鈕的顏色沒有改變,如下圖。


這樣做出來的對話框看起來,不是很自然,我們也想把按鈕的顏色改變一下。這就用到了按鈕的重繪。
      按鈕的重繪,主要原理是:一把按鈕的重繪屬性激活,而覆寫DrawItem方法。
     新建一個MFC類CCustButton類,繼承CButton類。
    主要代碼如下:CustomButton.h 

class CCustomButton : public CButton
{
    DECLARE_DYNAMIC(CCustomButton)

 public:
    CCustomButton();
    virtual ~CCustomButton();
    void SetButtonBgColor(COLORREF color);
    void SetButtonTextColor(COLORREF color);

private:
    COLORREF m_bgColor;
    COLORREF m_textColor;
    BOOL m_bPressed;

protected:
    DECLARE_MESSAGE_MAP()
    afx_msg void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
}; 

//CustomButton .cpp
IMPLEMENT_DYNAMIC(CCustomButton, CButton)

CCustomButton::CCustomButton()
{
    m_bgColor = RGB(239, 233, 235);
    m_textColor = RGB(0, 0, 0);
    m_bPressed = FALSE;
}

CCustomButton::~CCustomButton()
{
}


BEGIN_MESSAGE_MAP(CCustomButton, CButton)
    ON_WM_DRAWITEM()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()



// CCustomButton 消息處理程序

void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    CRect rect;
    GetClientRect(rect);
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);
    
    UINT state = lpDrawItemStruct->itemState;
    CRect focusRect(rect);
    focusRect.DeflateRect(4, 4, 4, 4);
    if ((state & ODS_SELECTED) || (state & ODS_FOCUS)) {
        CPen pen(PS_DASHDOTDOT, 1, RGB(0, 0, 0));
        CBrush brush;
        brush.CreateStockObject(NULL_BRUSH);
        dc.SelectObject(&brush);
        dc.SelectObject(&pen);
        dc.FillSolidRect(rect,m_bgColor);
        dc.DrawFocusRect(focusRect);
        dc.Draw3dRect(rect, RGB(51, 51, 51), RGB(0, 0, 0));
    } else {
        CPen pen(PS_DOT, 1, m_bgColor);
        CBrush brush;
        brush.CreateStockObject(NULL_BRUSH);
        dc.SelectObject(&brush);
        dc.SelectObject(&pen);
        dc.FillSolidRect(rect, m_bgColor);
        dc.Rectangle(focusRect);
    }
    dc.DrawEdge(rect, BDR_RAISEDINNER | BDR_RAISEDOUTER, BF_BOTTOMLEFT | BF_TOPRIGHT);
    if (m_bPressed) {
        dc.DrawFocusRect(focusRect);
        dc.DrawEdge(rect, BDR_RAISEDINNER | BDR_SUNKENOUTER, BF_BOTTOMLEFT | BF_TOPRIGHT);
        dc.Draw3dRect(rect, RGB(51, 51, 51), RGB(0, 0, 0));
    }
    CString strText;
    GetWindowText(strText);
    dc.SetBkMode(TRANSPARENT);
    dc.SetTextColor(m_textColor);
    if (state & ODS_DISABLED) {
        dc.SetTextColor(RGB(172, 168, 153));
    }
    dc.DrawText(strText, rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
    dc.Detach();
}
//按鈕被按下
void CCustomButton::OnLButtonDown(UINT nFlags, CPoint point)
{
    m_bPressed = TRUE;

    CButton::OnLButtonDown(nFlags, point);
}

//按鈕被釋放
void CCustomButton::OnLButtonUp(UINT nFlags, CPoint point)
{
    m_bPressed = FALSE;

    CButton::OnLButtonDown(nFlags, point);
}
//設置按鈕背景的顏色 
void CCustomButton::SetButtonBgColor(COLORREF color)
{
    m_bgColor = color;
}

//設置按鈕字體的顏色
void CCustomButton::SetButtonTextColor(COLORREF color)
{
    m_textColor = color;
} 

將按鈕的自繪屬性設為true

 

給按鈕添加一個變量
CButton m_bt_OpenFile;  
將CButton改成CCustomButton 變成
CCustomButton m_bt_OpenFile; 
在dialog里調用
//設置按鈕背景色
m_bt_OpenFile.SetButtonBgColor(m_BgColor);
//刷新窗口

InvalidateRect(NULL, TRUE);

UpdateWindow();即可
m_BgColor 為對話框的背景色。
效果如下:
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM