前幾天轉發了一篇網上搜到的文章“改變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);
}
}