如何在VC中改变控件的背景色

如题所述

一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有: CTLCOLOR_DLG 对话框 CTLCOLOR_EDIT 编辑框 CTLCOLOR_LISTBOX 列表框 CTLCOLOR_MSGBOX 消息框 CTLCOLOR_SCROLLBAR 滑动条 CTLCOLOR_STATIC 静态文本框、矩形等。 以下示例代码说明如何更改以上控件的背景色: //CmyDialog.h定义 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() }; //CmyDialog.cpp 定义 …… 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); }} 说明:1、可分别处理以上消息以实现不同控件不同背景色。 2、此方法不适用于按纽控件。 二、通过定制来实现不同颜色按纽。 以下通过定制方形彩色按纽来说明: 第一步:派生出自己的按纽类。 //CcolorButton.h class CColorButton : public CButton { DECLARE_DYNAMIC(CColorButton) public: CColorButton(); virtual ~CColorButton(); BOOL Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor = RGB(192, 123, 192), // 按纽的背景色 const COLORREF FGColor = RGB(1, 1, 1), // 文本颜色 ); 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 第二步:定义各函数 //CcolorButton.cpp …… // 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; focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框 btnRect.CopyRect(&lpDIS->rcItem); // 设置表示按纽被选中的虚线框 focusRect.left += 4; focusRect.right -= 4; focusRect.top += 4; focusRect.bottom -= 4; // 按纽标题 const int bufSize = 512; 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, R.left, R.top, R.right, R.top, RGB(255, 255, 255)); DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255)); //以下绘制按纽的外围框线以使按纽有立体感 DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1)); //绘制按纽左框线和上框线 DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1)); //绘制按纽右框线和下框线 } //用色彩填充按纽框 void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color) { CBrush B; B.CreateSolidBrush(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,在其上画一按键控件。
温馨提示:内容为网友见解,仅供参考
无其他回答

VC中改变窗口背景颜色和控件背景颜色
1.改变对话框的背景色 在C…App类中的InitInstance()里添加 SetDialogBkColor(RGB(0,192,0),RGB(0,0,0));2.如果想改变静态文本或单选按钮的背景色可以用你说的那个获得控件ID,然后设置背景色,具体步骤:(1)响应对话框类的WM_CTLCOLOR消息生成OnCtlColor函数 (2)为对话框类添加成员变量CBrush m_...

c语言:更改控件的背景颜色
调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。BOOL CSampleApp : : InitInstance ( ){ …\/\/use blue dialog with yellow text .Se...

VC++ 图像控件 初始颜色设置
回答:还需要在OnPaint()函数当中加入语句

VC 如何改变按钮控件文字颜色和底色呢?
试试在 消息 WM_CTLCOLOR 里面修改!很容易……给你个代码段 HBRUSH CShowDataView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ HBRUSH hbr = CView::OnCtlColor(pDC, pWnd, nCtlColor);if(CTLCOLOR_BTN == nCtlColor ){ \/\/HBRUSH brush = ::CreateSolidBrush(RGB(255,255,25...

vc 怎么设置一个编辑框的字体的大小或者颜色
调用字体对话框,来改变编辑框的字体和颜色1.添加一个编辑框 ID为 IDC_EDIT12.为编辑框添加变量 CEdit m_edit3.添加一个按钮触发该事件。void CTeTDlg::OnButton1() \/\/添加一个按钮 { \/\/ TODO: Add your control notification handler code here \/\/获得控件的当前字体 LOGFONT ...

vc中请问如何给对话框的控件修改背景图片
对话框,按钮等空间的基类都是CWnd,响应OnEraseBkgnd()函数,在里面重绘背景

VC MFC 单文档,无法改变RADIOBUTTON背景颜色
在OnCtlClolor里添加 switch (pWnd->GetDlgCtrlID()){ case IDC_RADIO1:pDC->SetBkMode(TRANSPARENT);\/\/设置控件RADIO背景透明 pDC->SetTextColor(RGB(0,60,255)); \/\/字体颜色(蓝色)case IDC_RADIO2:pDC->SetBkMode(TRANSPARENT);\/\/背景透明 pDC->SetTextColor(RGB(0,60,255)); \/\/字体颜色...

VC++6.0改变按钮颜色
添加dlg类的WM_DRAWITEM消息处理函数 void CBtncolorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct){ \/\/ TODO: Add your message handler code here and\/or call default if(nIDCtl==IDC_BUTTON1) \/\/checking for the button { CDC dc;RECT rect;dc.Attach(lpDrawItemStruct...

VC++中怎么设计背景和文本颜色,顺便给个例子吧,谢谢哦
全局设置对话框背景和文本颜色,可以使用 SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));形式 而要指定单一控件的色彩,主要是响应WM_CTLCOLOR消息 SetTextColor 文本前景色 SetBkColor 文本背景色

VC\/MFC 请问如何把窗体刷回原来的颜色?
你用的是对话框应用程序吧,按你上面的方法会把对话框上的控件也用填充色覆盖掉。用下面的方法就不会了:1、定义一个成员变量 m_clrBK,用来保存当前对话框的背景颜色;2、在OnInitDialog函数中添加如下的代码,初始化对话框的颜色为系统默认的颜色:m_clrBK = GetSysColor(COLOR_3DFACE);3、在On...

相似回答
大家正在搜