自己对“改变CButton按钮控件的文本和背景颜色”的理解

前几天转发了一篇网上搜到的文章“改变CButton按钮控件的文本和背景颜色”,里边描述了从CButton类继承自己可改变字体与背景颜色的按钮类的方法,自己经过测试,并进行了一些修改和调整,现将自己的经历记录如下。

自先声明一个CColorBtn类,并在其中添加一写相关参数,添加项参见注释。

//CColorBtn.h
class CColorBtn : public CButton
{
	DECLARE_DYNAMIC(CColorBtn)

public:
	CColorBtn();
	virtual ~CColorBtn();
	void SetHighLightTextColor(COLORREF color);//设置高亮时字体的颜色
	void SetHighLightBkColor(COLORREF color);//设置高亮时的背景颜色
	COLORREF GetHighLightTextColor() const;//获取高亮时字体的颜色
	COLORREF GetHighLightBkColor() const;//设置高亮时的背景颜色


protected:
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//重载,颜色的修改工作主要通过此函数来完	
        bool m_IsHighLight;//记录按钮是否处于高亮状态的标志
	UINT m_uStyle;//记录按钮类型的变量
	COLORREF m_HighLightTextColor;//文本高亮颜色值
	COLORREF m_HighLightBkColor;//背景高亮颜色值

protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClicked();
protected:
	virtual void PreSubclassWindow();
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};
以下是对应的CPP文件,主要列举一些关键函数:

1.构造函数:

CColorBtn::CColorBtn()
{
	m_IsHighLight=false;//默认按钮没有处于高亮状态
	m_uStyle=DFCS_BUTTONPUSH;//窗口的默认样式
	m_HighLightTextColor=RGB(255,0,0);//默认高亮字体为红色
	m_HighLightBkColor=RGB(0,255,0);//默认高亮背景色为绿色
}
2.鼠标按键按下响应函数:

void CColorBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_uStyle|=DFCS_PUSHED;
	CButton::OnLButtonDown(nFlags, point);
}
上述中,对于按钮的样式一定要用m_uStyle |=DFCS_PUSHED; 这样才能在保证按钮风格的情况下产生按下的效果。

3.鼠标按键弹起响应函数:

void CColorBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_uStyle=DFCS_BUTTONPUSH;
	CButton::OnLButtonUp(nFlags, point);
}

上述代码中,再将按钮样式回复为没有按下的状态即可:

4.修改按钮的OwnerDraw属性。由于在调用这个类时,不能保证用户会在界面上将按钮的OwnerDraw属性置为True,因此,这里通过代码来进行修改,主要通过重载PreSubclassWindow()函数来实现:

void CColorBtn::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	this->ModifyStyle(NULL,BS_OWNERDRAW);
	CButton::PreSubclassWindow();
}

5.自绘函数:

void CColorBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	// TODO:  添加您的代码以绘制指定项
	//依据窗口类型绘制控件
	::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,m_uStyle);
	CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
	//获取按钮的文本信息
	CString strText;
	GetWindowText(strText);
	LONG dist=0;//缩进距离
	CBrush brush;
	CRect rect;
	CRect focusRect;
	if(m_IsHighLight)
	{
		brush.CreateSolidBrush(m_HighLightBkColor);
	}
	else
	{
		brush.CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
	}
	rect.CopyRect(&lpDrawItemStruct->rcItem);
	dist=2;
	rect.left+=dist;
	rect.right-=dist;
	rect.top+=dist;
	rect.bottom-=dist;
	::FillRect(lpDrawItemStruct->hDC,&rect,(HBRUSH)brush.m_hObject);
	::SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);
	COLORREF crOldColor;
	if(m_IsHighLight)
	{
		crOldColor=::SetTextColor(lpDrawItemStruct->hDC,m_HighLightTextColor);
	}
	else
	{
		crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(0,0,0));
	}
	::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE|DT_VCENTER|DT_CENTER);
	::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
	if(::GetFocus()==this->m_hWnd)
	{
		focusRect.CopyRect(&lpDrawItemStruct->rcItem);
		dist=3;//缩进距离
		focusRect.left+=dist;
		focusRect.right-=dist;
		focusRect.top+=dist;
		focusRect.bottom-=dist;
		::DrawFocusRect(lpDrawItemStruct->hDC,(LPRECT)&focusRect);
	}	
}



你可能感兴趣的:(自己对“改变CButton按钮控件的文本和背景颜色”的理解)