帶有彈出式菜單的按鈕可以使一個按鈕具有多項選擇功能,擴展了按鈕的功能,相當於把多個按鈕集成於一體,可以減少按鈕數目。
這種按鈕的按鈕體分為兩個區域,單擊主體區域時,執行主體按鈕的功能,單擊選擇區域時,彈出一個菜單,可從中選擇要執行的功能。
下面,我們看一下它的制作過程:
一、新建一個以CButton類為基類的新類
單擊“Insert”→“New Class”,建立一個新類。基類設置為CButton,新類起名為CMenuButton。
二、利用自繪方法繪制按鈕,主體區顯示按鈕文本,選擇區畫一個小箭頭
在CMenuButton類中用ClassWizard添加函數:PreSubclassWindow()和DrawItem()。
PreSubclassWindow()函數在建立按鈕時執行,可用於做一些准備工作。在這裡我給按鈕添加自繪屬性:
void CMenuButton::PreSubclassWindow()
{
ModifyStyle( 0, BS_OWNERDRAW ); //設置按鈕屬性為自繪式
CButton::PreSubclassWindow();
}
DrawItem()函數用於繪制按鈕,左邊繪制按鈕文字,作為主體區,右邊繪制一個小箭頭,作為選擇區。實際應用中,可根據具體需要繪制想要的形狀和內容。
void CMenuButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
m_ButRect = lpDrawItemStruct->rcItem; //獲取按鈕尺寸
int nSavedDC = pDC->SaveDC();
VERIFY( pDC );
DrawButton(pDC); //繪制按鈕
pDC->RestoreDC( nSavedDC );
}
其中m_ButRect都是CRect型對象,在頭文件中進行定義。DrawButton()為繪制按鈕的函數,把它定義在外邊的目的是方便用戶修改,如果你想改變按鈕形狀,只需修改DrawButton()函數即可。
void CMenuButton::DrawButton(CDC *pDC)
{
m_LRect.SetRect( m_ButRect.left, m_ButRect.top,
m_ButRect.right-21, m_ButRect.bottom ); //按鈕主體區尺寸
m_RRect.SetRect( m_ButRect.right-20, m_ButRect.top,
m_ButRect.right, m_ButRect.bottom ); //按鈕選擇區尺寸
CPen Pen;
Pen.CreatePen(PS_SOLID, 1, RGB(192,192,192) );
pDC->SelectObject( &Pen );