📄 subject_24470.htm
字号:
<p>
序号:24470 发表者:intern99 发表日期:2002-12-12 22:25:06
<br>主题:改变button的颜色,请指点!
<br>内容:HBRUSH CDvrappDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) <BR>{<BR> HBRUSH hbr=CDialog::OnCtlColor(pDC, pWnd, nCtlColor);<BR> if(nCtlColor==CTLCOLOR_BTN)<BR> {<BR> pDC->SetBkMode(TRANSPARENT);<BR> pDC->SetTextColor(RGB(255,5,25));<BR> return m_hbrush;<BR> }<BR><BR> if(nCtlColor==CTLCOLOR_LISTBOX)<BR> {<BR> pDC->SetBkMode(TRANSPARENT);<BR> pDC->SetTextColor(RGB(255,5,25));<BR> return m_hbrush;<BR> }<BR> else<BR> return hbr;<BR> <BR>}<BR>可以改变listbox的颜色,但不能改变button的颜色。为什么?<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:tjhe 回复日期:2002-12-12 23:26:27
<br>内容:<BR>以下是一篇闻怡洋先生的作品,从vckbase上转载,在本站怎么没找到?<BR>先参考一下:<BR><BR><BR><BR>改变Push Button背景色 <BR>闻怡洋 <BR><BR>--------------------------------------------------------------------------------<BR> <BR>在Windows中Edit,StaticBox的背景色都可以通过处理WM_CTLCOLOR消息来改变,但Push Button却不行。<BR><BR>唯一的方法是使用OwnerDraw风格的按钮。本文讲述的方法是使用CButton的派生类。<BR><BR>class CCButton : public CButton<BR>{<BR>DECLARE_DYNAMIC(CCButton)<BR>public:<BR> CCButton(); <BR> virtual ~CCButton(); <BR> BOOL CCButton::Attach(const UINT nID, CWnd* pParent)<BR><BR>protected:<BR> virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);//必需重载的函数<BR><BR>public:<BR> COLORREF m_fg, m_bg, m_disabled_fg, m_disabled_bg;//四种颜色分别为文字,背景,失效时文字,失效时背景<BR>};<BR><BR><BR>实现DrawItem<BR><BR>void CCButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)<BR>{<BR> CDC* pDC = CDC::FromHandle(lpDIS->hDC);//???????DC<BR><BR> UINT state = lpDIS->itemState; //得到状态<BR> CRect focusRect, btnRect;//两个矩形,表示得当输入焦点时的虚线矩形和按钮矩形 <BR> focusRect.CopyRect(&lpDIS->rcItem); <BR> btnRect.CopyRect(&lpDIS->rcItem); <BR><BR> //<BR> //调整虚线矩形<BR> //<BR> focusRect.left += 4;<BR> focusRect.right -= 4;<BR> focusRect.top += 4;<BR> focusRect.bottom -= 4;<BR><BR> //<BR> // 得当Button上文字<BR> //<BR> const int bufSize = 512;<BR> TCHAR buffer[bufSize];<BR> GetWindowText(buffer, bufSize);<BR> <BR> // 使用m_fg, m_bg颜色利用 Draw3dRect(...)绘制按钮边框<BR><BR> // FillRect(...)填充按钮内部<BR><BR> // DrawText(...)绘制文字<BR><BR> //根据当前状态调整显示<BR> //<BR> if (state & ODS_FOCUS) {<BR> .........//得到输入焦点,通过focusRect画虚线<BR> if (state & ODS_SELECTED){ <BR> .....// 被按下,绘制下陷边框<BR> }<BR> }<BR> else if (state & ODS_DISABLED) {<BR> //失效,通过m_disabled_fg, m_disabled_bg 重绘按钮内部<BR> }<BR>} <BR><BR><BR>CCButton是CButton派生类,具有CButton的全部成员函数,但在创建时需要使用BS_OWNERDRAW风格。<BR><BR>如果按钮不是动态生成,使用Attach函数使CCButton代替原来按钮的窗口过程。<BR><BR>BOOL CCButton::Attach(const UINT nID, CWnd* pParent)<BR>{<BR> GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);<BR><BR> if (!SubclassDlgItem(nID, pParent))<BR> return FALSE;<BR><BR> return TRUE;<BR>} <BR><BR>如在一对话框的InitDialog(...)中加入下面几行<BR><BR>{// 假定 m_cbBtn为成员变量 IDC_BUTTON1为一按钮ID值<BR><BR> m_cbBtn.Attach(IDC_BUTTON1,this);<BR><BR>} <BR> <BR>
<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 + -