如何製作帶彈出式選單的按鈕

2021-04-13 05:08:50 字數 4988 閱讀 2781

帶有彈出式選單的按鈕可以使乙個按鈕具有多項選擇功能,擴充套件了按鈕的功能,相當於把多個按鈕整合於一體,可以減少按鈕數目。

這種按鈕的按鈕體分為兩個區域,單擊主體區域時,執行主體按鈕的功能,單擊選擇區域時,彈出乙個選單,可從中選擇要執行的功能。

下面,我們看一下它的製作過程:

一、新建乙個以cbutton類為基類的新類

單擊「insert」→「new class」,建立乙個新類。基類設定為cbutton,新類起名為cmenubutton。

二、利用自繪方法繪製按鈕,主體區顯示按鈕文字,選擇區畫乙個小箭頭

在cmenubutton類中用classwizard新增函式:presubclasswindow()和drawitem()。

presubclasswindow()函式在建立按鈕時執行,可用於做一些準備工作。在這裡我給按鈕新增自繪屬性:

void cmenubutton::presubclasswindow()  

drawitem()函式用於繪製按鈕,左邊繪製按鈕文字,作為主體區,右邊繪製乙個小箭頭,作為選擇區。實際應用中,可根據具體需要繪製想要的形狀和內容。

void cmenubutton::drawitem(lpdrawitemstruct lpdrawitemstruct)  

其中m_butrect都是crect型物件,在標頭檔案中進行定義。drawbutton()為繪製按鈕的函式,把它定義在外邊的目的是方便使用者修改,如果你想改變按鈕形狀,只需修改drawbutton()函式即可。

void cmenubutton::drawbutton(cdc *pdc)

point    m_pt[3], m_ptcentre;        //箭頭座標(三個頂點)

m_ptcentre = m_rrect.centerpoint();  //選擇區中點位置

m_pt[0].x = m_ptcentre.x-3;        //計算箭頭座標

m_pt[0].y = m_ptcentre.y-2;

m_pt[1].x = m_ptcentre.x+4;

m_pt[1].y = m_ptcentre.y-2;

m_pt[2].x = m_ptcentre.x;

m_pt[2].y = m_ptcentre.y+2;

pdc->selectstockobject( black_brush );  //定義畫刷(黑色)

crgn rgn;

rgn.createpolygonrgn( m_pt, 3, alternate );

pdc->paintrgn( &rgn );            //畫選擇區箭頭

pdc->settextcolor( m_forecolor ); //畫主體區文字

pdc->setbkmode( transparent );

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

| dt_vcenter | dt_end_ellipsis);

} m_state是個標誌,=0表示正常按鈕;=1表示滑鼠進入按鈕,繪製暗線邊框;=2表示在按鈕主體區按下滑鼠左鍵;=3表示在按鈕選擇區按下滑鼠左鍵。

在m_state的不同取值下,繪製不同的按鈕邊框,可以增加按鈕的動態效果。

三、新增滑鼠響應函式

在cmenubutton類中用classwizard新增函式:onmousemove()、onlbuttondown()、onlbuttonup()。

onmousemove()函式用於響應滑鼠移動訊息,當滑鼠進入按鈕時,設定相應標誌,並重繪按鈕邊框,當滑鼠離開按鈕時,清除標誌,恢復原邊框。

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

invalidate();       //重繪按鈕

} else

invalidate();        //重繪按鈕

} }

cbutton::onmousemove(nflags, point);

} b_inflag是個bool型量,滑鼠進入時設定,離開時清除,目的是防止滑鼠在按鈕上移動時重複重新整理按鈕,以避免閃爍。

b_clickflag是單擊按鈕選擇區標誌,當它為true時,表示彈出選單已開啟,為false時表示選單未彈出。當選單已經彈出,而滑鼠又移回按鈕單擊時,應清除選單。

b_clickbut是單擊按鈕主體區標誌。

onlbuttondown()函式響應按鈕單擊訊息,當單擊的是按鈕主體區時,設定b_clickbut標誌;當單擊的是按鈕選擇區時,要根據單擊次數,決定是否彈出選單。

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

else if( m_rrect.ptinrect(point) && m_menuid )  //單擊選擇區

else        //再次單擊,清除選單 }

cbutton::onlbuttondown(nflags, point);

} 當單擊按鈕選擇區時,在選擇區的左下角彈出選單,函式中的point是滑鼠的螢幕座標,求選單位置時也使用螢幕座標。

m_menuid是與按鈕關聯的彈出選單的id,它在建立按鈕時進行設定。

onlbuttonup()函式響應按鈕彈起訊息,這是只要恢復按鈕正常狀態即可,以產生單擊動畫效果。

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

四、自定義介面函式

提供使用者使用按鈕的介面。

//設定關聯選單id

void cmenubutton::setmenuid(int nid)

//設定按鈕文字

void cmenubutton::settext(cstring str)

//設定文字顏色

void cmenubutton::setforecolor(colorref color)

//設定背景顏色

void cmenubutton::setbkcolor(colorref color)

//是否單擊主按鈕區

bool cmenubutton::isclick()

由於這種按鈕分為兩個區域,使用時要根據單擊區域決定要做的工作,所以設定了isclick()介面函式。

五、變數的初始化

在cmenubutton類的標頭檔案中,定義有以下變數和函式:

menubutton.h

private:

int         m_state;        //按鈕狀態

bool        b_inflag;       //滑鼠進入標誌

bool        b_clickflag;    //單擊選擇區

bool        b_clickbut;     //單擊主體區

cstring     m_strtext;      //按鈕文字

colorref    m_forecolor;    //文字顏色

colorref    m_backcolor;    //背景色

crect       m_butrect;      //按鈕尺寸

crect       m_lrect;        //按鈕左部尺寸

crect       m_rrect;        //按鈕右部尺寸

cmenu       m_menu;         //彈出選單

int         m_menuid;       //選單id

void drawbutton(cdc *pdc);    //繪製按鈕

public:

cmenubutton();        //建構函式

void setmenuid(int nid);        //設定關聯選單id

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

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

void settext(cstring str); //設定按鈕文字

bool isclick();            //是否單擊主按鈕區

各變數的初始化在建構函式中進行:

cmenubutton::cmenubutton()

這樣,帶選單的按鈕類就做好了,用它定義的按鈕例項可以連線乙個彈出式按鈕,下面我們就看看怎樣定義按鈕例項。

六、生成按鈕例項

1、在對話方塊中放置按鈕,把它的大小調集成適;

2、用classwizard為按鈕新增變數,把變數的型別設定為cmenubutton;

3、定義按鈕的關聯選單

關聯選單就是普通的彈出式選單,用vc的選單編輯器生成即可。

進入資源的「menu」項,插入乙個新的選單,根據需要新增選單項。

4、設定按鈕

在對話方塊的oninitial()函式中初始化按鈕:

按鈕變數.setmenuid( 選單id );

按鈕變數.settext( 按鈕文字 );

按鈕變數.setbkcolor( 按鈕背景色 );

七、按鈕的響應

對按鈕的響應包括單擊按鈕主體區的響應和單擊選單項的響應兩部分。

用classwizard新增按鈕的響應函式和各選單項的響應函式。

在按鈕的響應函式中要做如下工作:

void cmbtestview::onmenubutton1()   }

這裡要求只有單擊按鈕的主體區時才進行響應。

至於單擊選單項的響應與普通選單一樣,這裡不再詳述。

這個按鈕類還有幾點可考慮改進:

①增加無效狀態(變灰)按鈕;

②設定按鈕文字字型。

相應方法可參考文章《可設定字型和顏色的按鈕》。 

VC 製作帶彈出式選單的按鈕

帶有彈出式選單的按鈕可以使乙個按鈕具有多項選擇功能,擴充套件了按鈕的功能,相當於把多個按鈕整合於一體,可以減少按鈕數目。這種按鈕的按鈕體分為兩個區域,單擊主體區域時,執行主體按鈕的功能,單擊選擇區域時,彈出乙個選單,可從中選擇要執行的功能。下面,我們看一下它的製作過程 一 新建乙個以cbutton類...

製作彈出式選單

lonkil 很老的一篇關於選單的文章,還是不錯的。發出來吧!一 在資源編輯器中建立乙個選單資源 新建乙個選單資源,比如把選單的id號為idc popmenu。此選單有一項兩層,即有乙個可彈出的選單項,而此選單項的彈出內容即為將要建立的彈 出式選單的內容。如右圖,可彈出項 下的選單即為將要建立的彈出...

彈出式選單

彈出式選單 popmenu 大家都熟悉,在win98的桌面上單擊滑鼠右鍵彈出的選單就是彈出式選單。通常情況下,彈出式選單在滑鼠右鍵單擊時彈出,當然,也可以根據需要隨時彈出。在vc 5的mfc中,管理選單的類叫cmenu。下面我向大家介紹建立乙個彈出式選單的基本方法。一 在資源編輯器中建立乙個選單資源...