1. 程式人生 > >VC6.0改變按鈕顏色及文字顏色(3)

VC6.0改變按鈕顏色及文字顏色(3)

以下為詳細的完成方式:

參加一個新類,類實:CMyButton,基類:CButton。

正在標頭檔案 MyButton.h 中參加以下變質和函式界說:

private:
intm_Style;//按鈕外形(0-一般,1-以後,2-按下,3-鎖訂)
BOOLb_InRect;//鼠本入進標記
CStringm_strText;//按鈕文字
COLORREFm_ForeColor;//文字顏色
COLORREFm_BackColor;//負風光
COLORREFm_LockForeColor;//鎖訂按鈕的筆墨色彩
CRectm_ButRect;//按鈕尺寸
CFont*p_Font;//字型

voidDrawButton(CDC*pDC);//畫一般的按鈕


//交心函式
public:
voidSetText(CStringstr);
voidSetForeColor(COLORREFcolor);//設放白原色彩
voidSetBkColor(COLORREFcolor);//設定負景顏色
voidSetTextFont(intFontHight,LPCTSTRFontName);//設定字型

正在 MyButton.cpp 的結構函式中始初化變質:

CMyButton::CMyButton()
{
m_Style=0;//按鈕外形作風
b_InRect=false;//滑鼠進入標記
m_strText=_T("");//按鈕白字(利用默許筆墨)
m_ForeColor=RGB(0,0,0);//文字顏色(玄色)

m_BackColor=RGB(243,243,243);//負風光(灰紅色)
m_LockForeColor=GetSysColor(COLOR_GRAYTEXT);//鎖訂按鈕的文字顏色
p_Font=NULL;//字型指標
}

用ClassWizard加加下列音訊函式:

PreSubclassWindow();
DrawItem();
OnMouseMove();
OnLButtonDown();
OnLButtonUp();

在各函式內參加程式碼:

voidCMyButton::PreSubclassWindow()
{
ModifyStyle(0,BS_OWNERDRAW);//設定按鈕屬性為自繪式

CButton::PreSubclassWindow();

}

PreSubclassWindow()在按鈕創立前主動施行,以是人們能夠在此中做一些始初事情。那裡人只做了一項農做,便是為按鈕設定屬性為“自繪”式,如許,使用者在加加按鈕後,便沒有需設定“Owner draw”屬性了。

voidCMyButton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct)
{
CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
m_ButRect=lpDrawItemStruct->rcItem;//獲與按鈕尺寸

if(m_strText.IsEmpty())
GetWindowText(m_strText);//獲取按鈕文字

intnSavedDC=pDC->SaveDC();
VERIFY(pDC);
DrawButton(pDC);//繪製按鈕
pDC->RestoreDC(nSavedDC);
}

DrawItem()函式是一個要害函式,按鈕的畫造事情便正在那裡舉行,帶閘道器DSR路由協議的流程,它的做用相稱於對於話框中的OnPaint()函式和檢視中的OnDraw()函式。

那裡人做了三項農做:獲與按鈕尺寸、獲與按鈕文字、繪製按鈕。此中繪製事情在自界說函式DrawButton()中完成。以下便是繪造程序:

voidCMyButton::DrawButton(CDC*pDC)
{
//調解狀況
if(m_Style==3)m_Style=0;
if(GetStyle()&WS_DISABLED)
m_Style=3;//制止形態
//依據形態調解邊框顏色和文字顏色
COLORREFbColor,fColor;//bColor為邊框顏色,fColor為文字顏色
switch(m_Style)
{
case0:bColor=RGB(192,192,huikao.orghttp://huikao.org/,192);fColor=m_ForeColor;break;//一般按鈕
case1:bColor=RGB(255,255,255);fColor=m_ForeColor;break;//滑鼠進入時按鈕
case2:bColor=RGB(192,192,192);fColor=m_ForeColor;break;//按下的按鈕
case3:bColor=m_BackColor;fColor=m_LockForeColor;break;//鎖定的按鈕
}
//繪製按鈕配景
CBrushBrush;
Brush.CreateSolidBrush(m_BackColor);//配景刷
pDC->SelectObject(&Brush);
CPenPen;
Pen.CreatePen(PS_SOLID,1,bColor);
pDC->SelectObject(&Pen);
pDC->RoundRect(&m_ButRect,CPoint(5,5));//繪圓角矩形
//繪製按鈕按下時的邊框
if(m_Style!=2)
{
CRectRect;
Rect.SetRect(m_ButRect.left+2,m_ButRect.top+1,m_ButRect.right,m_ButRect.bottom);
pDC->DrawEdge(&Rect,BDR_RAISEDINNER,BF_RECT);//畫邊框
}
//繪製按鈕文字
pDC->SetTextColor(fColor);//畫文字
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(m_strText,&m_ButRect,DT_SINGLELINE|DT_CENTER
|DT_VCENTER|DT_END_ELLIPSIS);
//畫造具有核心按鈕的虛線框
if(GetFocus()==this)
{
CRectRect;
Rect.SetRect(m_ButRect.left+3,m_ButRect.top+2,m_ButRect.right-3,羅萊家紡蠶絲被http://bj.bjlizhi.org/,m_ButRect.bottom-2);
pDC->DrawFocusRect(&Rect);//繪具有核心的虛線框
}
}

變數 m_Style 表徵以後按鈕狀態,它的取值為:0-正常,1-該前,2-按下,3-鎖定。沒有同形態下按鈕的邊框顏色和文字顏色有所沒有同。m_Style 的值在滑鼠呼應函式中進止改動。

繪製農作重要應用CDC類的畫圖函式完成,重要細緻在 m_Style 差別取值下表示進去的差異。

voidCMyButton::OnMouseMove(UINTnFlags,CPointpoint)
{
if(!b_InRect||GetCapture()!=this)//滑鼠進入按鈕
{
b_InRect=true;//設定入進標記
SetCapture();//捕捉鼠本
m_Style=1;//設定按鈕狀況
Invalidate();//沉畫按鈕
}
else
{
if(!m_ButRect.PtInRect(point))//滑鼠分開按鈕
{
b_InRect=false;//肅清進入標誌
ReleaseCapture();//開釋捕捉的滑鼠
m_Style=0;//設定按鈕狀況
Invalidate();//重繪按鈕
}
}

CButton::OnMouseMove(nFlags,point);
}

OnMouseMove()函式是滑鼠挪動新聞函式,用於判斷以後滑鼠指標能否在按鈕上。b_InRect是個標誌,為true表現滑鼠指標進入了按鈕地區,彼時要捕捉滑鼠,讓滑鼠下令傳送給按鈕。該滑鼠指標分開按鈕時,要肅清b_InRect標誌,而且開釋捕捉的滑鼠,讓別的視窗可以接受滑鼠下令。

Invalidate()函式用於更新按鈕,它會主動挪用DrawItem()函式重新繪製按鈕。

設定前提的目標是僅在滑鼠指標入進按鈕和分開按鈕時更新按鈕,如許能夠避免鼠本在按鈕上挪動時產生閃耀。

voidCMyButton::OnLButtonDown(UINTnFlags,CPointpoint)
{
m_Style=2;
Invalidate();//沉繪按鈕

CButton::OnLButtonDown(nFlags,駱駝服飾http://xiao.xiaochugao.org/,point);
}

OnLButtonDown()函式是雙打滑鼠右鍵時的新聞函式。這裡只是重新繪製按鈕,詳細的雙打呼應應當在具有按鈕的對於話框或者檢視中舉行。

voidCMyButton::OnLButtonUp(UINTnFlags,CPointpoint)
{
m_Style=1;
Invalidate();//沉繪按鈕

CButton::OnLButtonUp(nFlags,point);
}

OnLButtonUp()函式是雙打滑鼠右鍵後彈止時的新聞函式。這裡也只是重繪按鈕,這樣能使按鈕在按下和彈止時有所差別,使按鈕望上來有動態後果。

交口函式是用 CMyButton類 界說的按鈕改動色彩、字型和按鈕筆墨的接心,PL-SQL學習筆記 二,由以下函式構成:

//設放按鈕白原
voidCMyButton::SetText(CStringstr)
{
m_strText=_T("");
SetWindowText(str);

//設放文原顏色
voidCMyButton::SetForeColor(COLORREFcolor)
{
m_ForeColor=color;
Invalidate();

//設定配景顏色
voidCMyButton::SetBkColor(COLORREFcolor)
{
m_BackColor=color;
Invalidate();

//設定字型(字型高度、字型實)
voidCMyButton::SetTextFont(intFontHight,LPCTSTRFontName)
{
if(p_Font)deletep_Font;//刪除陳字型
p_Font=newCFont;
p_Font->CreatePointFont(FontHight,FontName);//創立新字型
SetFont(p_Font);//設定字型
}

因為新字型由 new 天生,必需顯式接納,這項工作可以在 CMyButton類 的解構函式中舉行:

CMyButton::~CMyButton()
{
if(p_Font)deletep_Font;//刪除字型
}

如許一個可設定顏色、字型的按鈕類便做佳了。利用時,先在對於話框中擱置佳按鈕,再用 ClassWizard 為按鈕加加節制變數,而且將變質的範例設定為 CMyButton。之後,能夠用當變數挪用交心函式設定按鈕顏色和字型。詳細情形可以參考示例步伐。

示例步伐界裡:

本文所用MFC函式快查:
CBrush::CreateSolidBrush
CDC::DrawEdge
CDC::DrawFocusRect
CDC::DrawText
CDC::FromHandle
CDC::RestoreDC
CDC::RoundRect
CDC::SaveDC
CDC::SelectObject
CDC::SetBkMode
CDC::SetTextColor
CFont::CreatePointFont
CPen::CreatePen
CRect::PtInRect
CRect::SetRect
CString::IsEmpty
CWnd::GetCapture
CWnd::GetFocus
CWnd::GetStyle
CWnd::GetWindowText
CWnd::Invalidate
CWnd::ModifyStyle
CWnd::ReleaseCapture
CWnd::SetCapture
CWnd::SetFont
CWnd::SetWindowText

程式碼檢察—由同事們尋覓程式碼中的搭檔—所發覺的差錯取在測試中所發明的過錯差別,