📄 subject_47808.htm
字号:
<p>
序号:47808 发表者:名字没想好 发表日期:2003-07-24 14:59:42
<br>主题:如何改变BUTTON的背景色?
<br>内容: 如题,请大虾们指点一二,谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:阿蝌 回复日期:2003-07-24 15:44:04
<br>内容:重载CButton的=WM_CTLCOLOR消息响应函数
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:名字没想好 回复日期:2003-07-24 15:48:52
<br>内容: caishaikedou,不好意思,你说的我不是很明白,因为BUTTON根本就没有WM_CTLCOLOR函数,你是指的CBUTTON类嘛,但程序中也没有这个类呀,请问该如何设置,谢谢!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:风之文章 回复日期:2003-07-24 16:00:28
<br>内容:<BR>如何在VC中改变控件的背景色<BR><BR>转载自《电脑报》 (文/欧阳沐)<BR><BR>提要:<BR><BR> 在VC编程中要改变控件(诸如CView, CFrameWnd, or CWnd等)的背景色可通过处理特定的消息来实现。但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮,此处未做说明)而不能通过OnCtlColor()改变。<BR><BR><BR>正文:<BR><BR> 一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有:<BR><BR>CTLCOLOR_DLG 对话框 <BR><BR>CTLCOLOR_EDIT 编辑框<BR><BR>CTLCOLOR_LISTBOX 列表框 <BR><BR>CTLCOLOR_MSGBOX 消息框<BR><BR>CTLCOLOR_SCROLLBAR 滑动条<BR><BR>CTLCOLOR_STATIC 静态文本框、矩形等。<BR><BR><BR>以下示例代码说明如何更改以上控件的背景色:<BR><BR>//CmyDialog.h定义 <BR><BR>class CMyDialog : public Cdialog //派生自己的对话框类<BR><BR>{<BR><BR>……..<BR><BR>// Implementation <BR><BR>protected: <BR><BR>// Generated message map functions<BR><BR>//{{AFX_MSG(CMyDialog)<BR><BR>afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);<BR><BR>……. <BR><BR>//}}AFX_MSG<BR><BR>DECLARE_MESSAGE_MAP() <BR><BR>};<BR><BR><BR>//CmyDialog.cpp 定义<BR><BR>……<BR><BR>HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) <BR><BR>{<BR><BR>switch (nCtlColor) { <BR><BR>case CTLCOLOR_EDIT:<BR><BR>case CTLCOLOR_MSGBOX:<BR><BR>case CTLCOLOR_DLG : <BR><BR>case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息<BR><BR>pDC->SetBkMode(TRANSPARENT);<BR><BR>HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色 <BR><BR>return (HBRUSH) B;<BR><BR>default: //其他控件设置自己默认的颜色和背景刷.<BR><BR>return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); <BR><BR>}}<BR><BR>说明:1、可分别处理以上消息以实现不同控件不同背景色。<BR><BR>2、此方法不适用于按纽控件。<BR><BR><BR>二、通过定制来实现不同颜色按纽。<BR><BR>以下通过定制方形彩色按纽来说明: <BR><BR>第一步:派生出自己的按纽类。<BR><BR>//CcolorButton.h <BR><BR>class CColorButton : public CButton<BR><BR>{<BR><BR>DECLARE_DYNAMIC(CColorButton)<BR><BR>public:<BR><BR>CColorButton(); <BR><BR>virtual ~CColorButton(); <BR><BR><BR>BOOL Attach(const UINT nID, CWnd* pParent, <BR><BR>const COLORREF BGColor = RGB(192, 123, 192), // 按纽的背景色<BR><BR>const COLORREF FGColor = RGB(1, 1, 1), // 文本颜色<BR><BR>);<BR><BR>protected:<BR><BR>virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem<BR><BR>void DrawFrame(CDC *DC, CRect R); //绘制按纽框<BR><BR>void DrawFilledRect(CDC *DC, CRect R, COLORREF color); //填充按纽框<BR><BR>void DrawLine(CDC *DC, CRect EndPoints, COLORREF color); <BR><BR>void DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color);<BR><BR>void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);<BR><BR>//绘制按纽上的文本<BR><BR><BR>COLORREF GetFGColor() { return m_fg; } <BR><BR>COLORREF GetBGColor() { return m_bg; }<BR><BR>private:<BR><BR>COLORREF m_fg, m_bg;<BR><BR>};<BR><BR>#endif<BR><BR><BR>第二步:定义各函数<BR><BR>//CcolorButton.cpp<BR><BR>……<BR><BR>// CColorButton<BR><BR>IMPLEMENT_DYNAMIC(CColorButton, CButton)<BR><BR>CColorButton::CColorButton() <BR><BR>{ } <BR><BR>CColorButton::~CColorButton()<BR><BR>{<BR><BR>} <BR><BR><BR>//定义Attach()函数<BR><BR>BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor)<BR><BR>{<BR><BR>if (!SubclassDlgItem(nID, pParent))<BR><BR>return FALSE;<BR><BR>m_fg = FGColor;<BR><BR>m_bg = BGColor; <BR><BR>return TRUE;<BR><BR>}<BR><BR><BR>//重载DrawItem()<BR><BR>void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)<BR><BR>{<BR><BR>CDC* pDC = CDC::FromHandle(lpDIS->hDC);<BR><BR>UINT state = lpDIS->itemState; <BR><BR>CRect focusRect, btnRect;<BR><BR>focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框<BR><BR>btnRect.CopyRect(&lpDIS->rcItem); <BR><BR><BR>// 设置表示按纽被选中的虚线框<BR><BR>focusRect.left += 4;<BR><BR>focusRect.right -= 4;<BR><BR>focusRect.top += 4;<BR><BR>focusRect.bottom -= 4;<BR><BR><BR>// 按纽标题<BR><BR>const int bufSize = 512;<BR><BR>TCHAR buffer[bufSize];<BR><BR>GetWindowText(buffer, bufSize);<BR><BR><BR>// 绘制并标志按纽 <BR><BR>DrawFilledRect(pDC, btnRect, GetBGColor()); <BR><BR>DrawFrame(pDC, btnRect);<BR><BR>DrawButtonText(pDC, btnRect, buffer, GetFGColor());<BR><BR><BR>// 如果按纽处于选中状态则在其上绘制选中虚线框<BR><BR>if (state & ODS_FOCUS) {<BR><BR>DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);<BR><BR>}<BR><BR>}<BR><BR>void CColorButton::DrawFrame(CDC *DC, CRect R)<BR><BR>{ //绘制按纽,用户通过定制该函数可实现不同形状的按纽。<BR><BR>DrawLine(DC, R.left, R.top, R.right, R.top, RGB(255, 255, 255)); <BR><BR>DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255)); <BR><BR>//以下绘制按纽的外围框线以使按纽有立体感<BR><BR>DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));<BR><BR>//绘制按纽左框线和上框线<BR><BR>DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1));<BR><BR>//绘制按纽右框线和下框线 <BR><BR>}<BR><BR>//用色彩填充按纽框<BR><BR>void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)<BR><BR>{ <BR><BR>CBrush B;<BR><BR>B.CreateSolidBrush(color);<BR><BR>DC->FillRect(R, &B);<BR><BR>}<BR><BR>// DrawLine用于绘制按纽,其为多态函数<BR><BR>void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color)<BR><BR>{ <BR><BR>……<BR><BR>}<BR><BR>void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color)<BR><BR>{ <BR><BR>……<BR><BR>}<BR><BR>//绘制按纽文本<BR><BR>void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)<BR><BR>{<BR><BR>COLORREF prevColor = DC->SetTextColor(TextColor);<BR><BR>DC->SetBkMode(TRANSPARENT);<BR><BR>DC->DrawText(Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);<BR><BR>DC->SetTextColor(prevColor);<BR><BR>}<BR><BR><BR>第三步:引用定制类<BR><BR>定制任意对话框CColorDlg,在其上画一按键控件。ID为IDOK。<BR><BR>//CColorDlg.h<BR><BR>class CColorDlg : public CDialog<BR><BR>{<BR><BR>…..<BR><BR>// Implementation<BR><BR>protected:<BR><BR>CColorButton m_btnOK;<BR><BR>}<BR><BR><BR>//CColorDlg.cpp<BR><BR>…….<BR><BR>BOOL CColorBtnSampleDlg::OnInitDialog()<BR><BR>{<BR><BR>CDialog::OnInitDialog();<BR><BR>…….<BR><BR>VERIFY(m_btnOK.Attach(IDOK, this, RED, BLUE, YELLOW));<BR><BR>…….<BR><BR>}<BR><BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:haykey 回复日期:2003-07-25 11:07:56
<br>内容:佩服佩服:)小弟也有一法。在button属性中划上自绘属性。好像英文名是owner draw?然后重载OnDrawItem(...)这样不光改色,在按钮上贴张图片都小case了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:名字没想好 回复日期:2003-07-28 14:16:42
<br>内容:谢谢“风之文章”,非常感谢你的无私帮助;<BR>另外,“haykey”你说的方法能详细的说一下嘛,如果需要分的话我一定给,谢谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:流诊圆 回复日期:2003-07-29 18:02:49
<br>内容:GetDlgItem(ID_buttonName)->SetBkColor(RBG(1,1,1));<BR><BR>不知道这个行不行
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:名字没想好 回复日期:2003-07-30 09:49:54
<br>内容:流诊圆,你上面这句代码应该加在什么地方呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:haykey 回复日期:2003-07-31 00:01:43
<br>内容:呵呵,有分数这么诱人,我就来一把!:)<BR>首先你根据APPWizard随便建立个单文档或多文档视图的程序吧,知道它们都有一个主菜单,其中有关于一项,一点就出来MFC经典对话框。<BR>我们就拿它里面的IDOK按钮下手!!!<BR>1。打开资源视图。在IDD_ABOUTBOX里的IDOK按钮属性对话里把第2个选项卡(stytles)中的owner draw选中(你要是中文版的,汉化为所用者)<BR>2.ClassWizard重载CAboutDlg的WM_DRAWITEM消息。然后自动生成个OnDrawItem()函数。<BR>3.加入如下代码<BR>void CAboutDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) <BR>{<BR>// TODO: Add your message handler code here and/or call default<BR> CDC buttonDC;<BR> CDC memDC;<BR> UINT uState;<BR> buttonDC.Attach(lpDrawItemStruct->hDC);<BR> memDC.CreateCompatibleDC(&buttonDC);<BR> CRect rect = lpDrawItemStruct->rcItem;<BR> uState = lpDrawItemStruct->itemState;<BR> if(uState&ODS_FOCUS)<BR> {<BR> buttonDC.FillRect(&rect,&CBrush(RGB(0,0,255)));<BR> buttonDC.SetBkMode(TRANSPARENT);<BR> buttonDC.DrawText("自绘属性",&rect,DT_CENTER);<BR> }<BR> else <BR> buttonDC.FillRect(&rect,&CBrush(RGB(255,0,0)));<BR><BR> CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);<BR>}<BR>看看效果吧,兄台,还有别忘记给分啊:)<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:名字没想好 回复日期:2003-07-31 09:45:22
<br>内容:谢谢haykey,如果正确的话分我一定给,我现在还想再问一下的是,如果是基于DLG的程序呢,另外还有在单/多文档程序中我随意添加的对话框呢,方法是一样的嘛,需要自己定义什么变量及另外的什么东西嘛,烦请再相告一二,谢谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:haykey 回复日期:2003-08-01 12:26:11
<br>内容:什么也不需添加,一样处理:)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:名字没想好 回复日期:2003-08-01 13:56:02
<br>内容:haykey,你说的方法我试过了,是可以改变它的背景色,但是按钮没有了凸出的感觉,并且按钮上的文本在里面的排列了也不规范,请指点!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:大森林 回复日期:2003-08-01 21:22:24
<br>内容:可以查找一片有关实现xp风格按钮的程序实例,里面的内容可以实现你所要求的效果
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -