自己對“改變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);
	}	
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章