我們發現想改變對話框的背景顏色是很簡單的,但是對話框的背景顏色改變了后,我們發現按鈕的顏色沒有改變,如下圖。
這樣做出來的對話框看起來,不是很自然,我們也想把按鈕的顏色改變一下。這就用到了按鈕的重繪。
按鈕的重繪,主要原理是:一把按鈕的重繪屬性激活,而覆寫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 為對話框的背景色。
效果如下: