在VC编程中要改变控件(诸如CView CFrameWnd or CWnd等)的背景色可通过处理特定的消息来实现但如果想改变按钮的颜色就只能使用自绘制的按钮(也可以用位图按钮此处未做说明)而不能通过OnCtlColor()改变 一在一个MFC应用程序中要改变控件的背景色可通过重载OnCtlColor()函数来实现方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的常用的此类消息有 CTLCOLOR_DLG 对话框 CTLCOLOR_EDIT 编辑框 CTLCOLOR_LISTBOX 列表框 CTLCOLOR_MSGBOX 消息框 CTLCOLOR_SCROLLBAR 滑动条 CTLCOLOR_STATIC 静态文本框矩形等 以下示例代码说明如何更改以上控件的背景色
//CmyDialogh定义 class CMyDialog : public Cdialog //派生自己的对话框类 { …… // Implementation protected: // Generated message map functions //{{AFX_MSG(CMyDialog) afx_msg HBRUSH OnCtlColor(CDC* pDC CWnd* pWnd UINT nCtlColor); …… //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //CmyDialogcpp 定义 …… HBRUSH CMyDialog::OnCtlColor(CDC* pDC CWnd* pWnd UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_EDIT: case CTLCOLOR_MSGBOX: case CTLCOLOR_DLG : case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息 pDC>SetBkMode(TRANSPARENT); HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色 return (HBRUSH) B; default: //其他控件设置自己默认的颜色和背景刷 return CDialog::OnCtlColor(pDC pWnd nCtlColor); } } 说明可分别处理以上消息以实现不同控件不同背景色 此方法不适用于按纽控件 二通过定制来实现不同颜色按纽 以下通过定制方形彩色按纽来说明 第一步派生出自己的按纽类 //CcolorButtonh class CColorButton : public CButton { DECLARE_DYNAMIC(CColorButton) public: CColorButton(); virtual ~CColorButton(); BOOL Attach(const UINT nID CWnd* pParent const COLORREF BGColor = RGB( ) // 按纽的背景色 const COLORREF FGColor = RGB( ) // 文本颜色 ); protected: virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem void DrawFrame(CDC *DC CRect R); //绘制按纽框 void DrawFilledRect(CDC *DC CRect R COLORREF color); //填充按纽框 void DrawLine(CDC *DC CRect EndPoints COLORREF color); void DrawLine(CDC *DC long left long top long right long bottom COLORREF color); void DrawButtonText(CDC *DC CRect R const char *Buf COLORREF TextColor); //绘制按纽上的文本 COLORREF GetFGColor() { return m_fg; } COLORREF GetBGColor() { return m_bg; } private: COLORREF m_fg m_bg; }; #endif 第二步定义各函数
//CcolorButtoncpp …… // CColorButton IMPLEMENT_DYNAMIC(CColorButton CButton) CColorButton::CColorButton() { } CColorButton::~CColorButton() { } //定义Attach()函数 BOOL CColorButton::Attach(const UINT nID CWnd* pParent const COLORREF BGColor const COLORREF FGColor) { if (!SubclassDlgItem(nID pParent)) return FALSE; m_fg = FGColor; m_bg = BGColor; return TRUE; } //重载DrawItem() void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS>hDC); UINT state = lpDIS>itemState; CRect focusRect btnRect; focusRectCopyRect(&lpDIS>rcItem); //按纽的选中虚线框 btnRectCopyRect(&lpDIS>rcItem); // 设置表示按纽被选中的虚线框 focusRectleft += ; focusRectright = ; focusRecttop += ; focusRectbottom = ; // 按纽标题 const int bufSize = ; TCHAR buffer[bufSize]; GetWindowText(buffer bufSize); // 绘制并标志按纽 DrawFilledRect(pDC btnRect GetBGColor()); DrawFrame(pDC btnRect); DrawButtonText(pDC btnRect buffer GetFGColor()); // 如果按纽处于选中状态则在其上绘制选中虚线框 if (state & ODS_FOCUS) { DrawFocusRect(lpDIS>hDC (LPRECT)&focusRect); } } void CColorButton::DrawFrame(CDC *DC CRect R) { //绘制按纽用户通过定制该函数可实现不同形状的按纽 DrawLine(DC Rleft Rtop Rright Rtop RGB( )); DrawLine(DC Rleft Rtop Rleft Rbottom RGB( )); //以下绘制按纽的外围框线以使按纽有立体感 DrawLine(DC Rleft + Rbottom Rright Rbottom RGB( )); //绘制按纽左框线和上框线 DrawLine(DC Rright Rtop + Rright Rbottom RGB( )); //绘制按纽右框线和下框线 } //用色彩填充按纽框 void CColorButton::DrawFilledRect(CDC *DC CRect R COLORREF color) { CBrush B; BCreateSolidBrush(color); DC>FillRect(R &B); } // DrawLine用于绘制按纽其为多态函数 void CColorButton::DrawLine(CDC *DC CRect EndPoints COLORREF color) { …… } void CColorButton::DrawLine(CDC *DC long left long top long right long bottom COLORREF color) { …… } //绘制按纽文本 void CColorButton::DrawButtonText(CDC *DC CRect R const char *Buf COLORREF TextColor) { COLORREF prevColor = DC>SetTextColor(TextColor); DC>SetBkMode(TRANSPARENT); DC>DrawText(Buf strlen(Buf) R DT_CENTER|DT_VCENTER|DT_SINGLELINE); DC>SetTextColor(prevColor); } 第三步引用定制类 定制任意对话框CColorDlg在其上画一按键控件ID为IDOK
//CColorDlgh class CColorDlg : public CDialog { … // Implementation protected: CColorButton m_btnOK; } //CColorDlgcpp …… BOOL CColorBtnSampleDlg::OnInitDialog() { CDialog::OnInitDialog(); …… VERIFY(m_btnOKAttach(IDOK this RED BLUE YELLOW)); …… } |