vc可設定字型和顏色的按鈕

2021-09-01 08:05:34 字數 3984 閱讀 4875

以下為具體的實現方法:

加入乙個新類,類名:cmybutton,基類:cbutton。

在標頭檔案 mybutton.h 中加入以下變數和函式定義:

private:

int m_style;//按鈕形狀(0-正常,1-當前,2-按下,3-鎖定)

bool b_inrect;//滑鼠進入標誌

cstring m_strtext;//按鈕文字

colorref m_forecolor;//文字顏色

colorref m_backcolor;//背景色

colorref m_lockforecolor;//鎖定按鈕的文字顏色

crect m_butrect;//按鈕尺寸

cfont* p_font;//字型

void drawbutton(cdc *pdc);//畫正常的按鈕

// 介面函式

public:

void settext(cstring str);

void setforecolor(colorref color);//設定文字顏色

void setbkcolor(colorref color);//設定背景顏色

void settextfont(int fonthight,lpctstr fontname);//設定字型

在 mybutton.cpp 的建構函式中初始化變數:

cmybutton::cmybutton()

用classwizard新增下列訊息函式:

presubclasswindow();

drawitem();

onmousemove();

onlbuttondown();

onlbuttonup();

在各函式內加入**:

void cmybutton::presubclasswindow()

presubclasswindow()在按鈕建立前自動執行,所以我們可以在其中做一些初始工作。這裡我只做了一項工作,就是為按鈕設定屬性為「自繪」式,這樣,使用者在新增按鈕後,就不需設定「owner draw」屬性了。

void cmybutton::drawitem(lpdrawitemstruct lpdrawitemstruct)

drawitem()函式是乙個關鍵函式,按鈕的繪製工作就在這裡進行,它的作用相當於對話方塊中的onpaint()函式和檢視中的ondraw()函式。

這裡我做了三項工作:獲取按鈕尺寸、獲取按鈕文字、繪製按鈕。其中繪製工作在自定義函式drawbutton()中完成。以下就是繪製過程:

void cmybutton::drawbutton(cdc *pdc)

//繪製按鈕背景

cbrush brush;

brush.createsolidbrush( m_backcolor );//背景刷

pdc->selectobject( &brush );

cpen pen;

pen.createpen(ps_solid, 1, bcolor );

pdc->selectobject( &pen );

pdc->roundrect(&m_butrect,cpoint(5,5));//畫圓角矩形

//繪製按鈕按下時的邊框

if( m_style!=2 )

//繪製按鈕文字

pdc->settextcolor( fcolor );//畫文字

pdc->setbkmode( transparent );

pdc->drawtext( m_strtext, &m_butrect, dt_singleline | dt_center

| dt_vcenter | dt_end_ellipsis);

//繪製擁有焦點按鈕的虛線框

if( getfocus()==this )

} 變數 m_style 表徵當前按鈕狀態,它的取值為:0-正常,1-當前,2-按下,3-鎖定。不同狀態下按鈕的邊框顏色和文字顏色有所不同。m_style 的值在滑鼠響應函式中進行修改。

繪製工作主要利用cdc類的繪圖函式完成,主要注意在 m_style 不同取值下表現出來的差別。

void cmybutton::onmousemove(uint nflags, cpoint point)

else

}cbutton::onmousemove(nflags, point);

} onmousemove()函式是滑鼠移動訊息函式,用於判定當前滑鼠指標是否在按鈕上。b_inrect是個標誌,為true表示滑鼠指標進入了按鈕區域,此時要捕獲滑鼠,讓滑鼠命令傳送給按鈕。當滑鼠指標離開按鈕時,要清除b_inrect標誌,並且釋放捕獲的滑鼠,讓其它視窗可以接收滑鼠命令。

invalidate()函式用於更新按鈕,它會自動呼叫drawitem()函式重新繪製按鈕。

設定條件的目的是僅在滑鼠指標進入按鈕和離開按鈕時更新按鈕,這樣可以防止滑鼠在按鈕上移動時發生閃爍。

void cmybutton::onlbuttondown(uint nflags, cpoint point)

onlbuttondown()函式是單擊滑鼠左鍵時的訊息函式。這裡只是重新繪製按鈕,具體的單擊響應應該在擁有按鈕的對話方塊或檢視中進行。

void cmybutton::onlbuttonup(uint nflags, cpoint point)

onlbuttonup()函式是單擊滑鼠左鍵後彈起時的訊息函式。這裡也只是重繪按鈕,這樣能使按鈕在按下和彈起時有所不同,使按鈕看上去有動態效果。

介面函式是用 cmybutton類 定義的按鈕修改顏色、字型和按鈕文字的介面,由以下函式組成:

//設定按鈕文字

void cmybutton::settext(cstring str)

//設定文字顏色

void cmybutton::setforecolor(colorref color)

//設定背景顏色

void cmybutton::setbkcolor(colorref color)

//設定字型(字型高度、字型名)

void cmybutton::settextfont(int fonthight,lpctstr fontname)

由於新字型由 new 生成,必須顯式**,這項工作可以在 cmybutton類 的析構函式中進行:

cmybutton::~cmybutton()

這樣乙個可設定顏色、字型的按鈕類就做好了。使用時,先在對話方塊中放置好按鈕,再用 classwizard 為按鈕新增控制變數,並且將變數的型別設定為 cmybutton。之後,可以用該變數呼叫介面函式設定按鈕顏色和字型。具體情況可以參考示例程式。

方法二:

新增dlg類的wm_drawitem訊息處理函式

void cbtncolordlg::ondrawitem(int nidctl, lpdrawitemstruct lpdrawitemstruct)

else

dc.setbkcolor(rgb(100,100,255)); //setting the text background color

dc.settextcolor(rgb(255,0,0)); //setting the text color

tchar buffer[max_path]; //to store the caption of the button.

zeromemory(buffer,max_path ); //intializing the buffer to zero

::getwindowtext(lpdrawitemstruct->hwnditem,buffer,max_path); //get the caption of button window

dc.drawtext(buffer,&rect,dt_center|dt_vcenter|dt_singleline);//redraw the caption of button window

dc.detach(); // detach the button dc

}cdialog::ondrawitem(nidctl, lpdrawitemstruct);

為vc按鈕新增背景顏色和字型顏色

可以通過過載wm drawitem訊息來實現,具體函式如下所示 void cbtncolordlg ondrawitem int nidctl,lpdrawitemstruct lpdrawitemstruct else dc.setbkcolor rgb 100,100,255 setting t...

vc自定義類設定按鈕的字型和顏色

以下為具體的實現方法 加入乙個新類,類名 cmybutton,基類 cbutton。在標頭檔案 mybutton.h 中加入以下變數和函式定義 private int m style 按鈕形狀 0 正常,1 當前,2 按下,3 鎖定 bool b inrect 滑鼠進入標誌 cstring m st...

VC中字型顏色的設定

由於在vc程式設計中,不能單獨對介面中的某一部分的字型進行設定,只能對整個窗體的字型進行整體設定 在窗體的font屬性中進行設定 如果想對某一元件或某些元件的字型進行改變,需要在程式中實現,比如在oninitdialog 初始化 中程式設計實現。例如 cfont font font.createpo...