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