📄 0511002.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>
<body>
<div align="justify">
<table border="0" width="100%" class="font" height="57">
<tr>
<td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">VC知识库(五)</font>
</td>
<td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">www.vckbase.com</font>
</td>
</tr>
<tr>
<td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
<strong><big><font color="#000080">改变Push Button背景色</font></big></strong>
</td>
</tr>
<tr>
<td width="100%" height="17" class="info" align="center" colspan="2">
<strong><big><font color="#000080">闻怡洋</font></big></strong>
</td>
</tr>
<tr>
<td width="100%" height="22" class="font" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="5" class="font" colspan="2">
<p>在Windows中Edit,StaticBox的背景色都可以通过处理WM_CTLCOLOR消息来改变,但Push
Button却不行。</p>
<p>唯一的方法是使用OwnerDraw风格的按钮。本文讲述的方法是使用CButton的派生类。</p>
<p>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>
</p>
<p>实现DrawItem</p>
<p>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(...)绘制按钮边框</p>
<p> // FillRect(...)填充按钮内部</p>
<p> // 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>
</p>
<p>CCButton是CButton派生类,具有CButton的全部成员函数,但在创建时需要使用BS_OWNERDRAW风格。</p>
<p>如果按钮不是动态生成,使用Attach函数使CCButton代替原来按钮的窗口过程。</p>
<p>BOOL CCButton::Attach(const UINT nID, CWnd* pParent)<br>
{<br>
GetDlgItem(nID)->ModifyStyle(0,BS_OWNERDRAW,0);</p>
<p> if (!SubclassDlgItem(nID, pParent))<br>
return FALSE;<br>
<br>
return TRUE;<br>
} </p>
<p>如在一对话框的InitDialog(...)中加入下面几行</p>
<p>{// 假定 m_cbBtn为成员变量 IDC_BUTTON1为一按钮ID值</p>
<p> m_cbBtn.Attach(IDC_BUTTON1,this);</p>
<p>}
</p>
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -