帶有彈出式選單的按鈕可以使乙個按鈕具有多項選擇功能,擴充套件了按鈕的功能,相當於把多個按鈕整合於一體,可以減少按鈕數目。
這種按鈕的按鈕體分為兩個區域,單擊主體區域時,執行主體按鈕的功能,單擊選擇區域時,彈出乙個選單,可從中選擇要執行的功能。
下面,我們看一下它的製作過程:
一、新建乙個以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()函式用於響應滑鼠移動訊息,當滑鼠進入按鈕時,設定相應標誌,並重繪按鈕邊框,當滑鼠離開按鈕時,清除標誌,恢復原邊框。
如何製作帶彈出式選單的按鈕
帶有彈出式選單的按鈕可以使乙個按鈕具有多項選擇功能,擴充套件了按鈕的功能,相當於把多個按鈕整合於一體,可以減少按鈕數目。這種按鈕的按鈕體分為兩個區域,單擊主體區域時,執行主體按鈕的功能,單擊選擇區域時,彈出乙個選單,可從中選擇要執行的功能。下面,我們看一下它的製作過程 一 新建乙個以cbutton類...
製作彈出式選單
lonkil 很老的一篇關於選單的文章,還是不錯的。發出來吧!一 在資源編輯器中建立乙個選單資源 新建乙個選單資源,比如把選單的id號為idc popmenu。此選單有一項兩層,即有乙個可彈出的選單項,而此選單項的彈出內容即為將要建立的彈 出式選單的內容。如右圖,可彈出項 下的選單即為將要建立的彈出...
彈出式選單
彈出式選單 popmenu 大家都熟悉,在win98的桌面上單擊滑鼠右鍵彈出的選單就是彈出式選單。通常情況下,彈出式選單在滑鼠右鍵單擊時彈出,當然,也可以根據需要隨時彈出。在vc 5的mfc中,管理選單的類叫cmenu。下面我向大家介紹建立乙個彈出式選單的基本方法。一 在資源編輯器中建立乙個選單資源...