MFC工具欄ToolBar按鈕新增下拉選單
1.在MainFrm.cpp的int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函式末尾新增如下程式碼:
//為畫圖工具欄的按鈕新增下拉選單
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//取值TBSTYLE_EX_DRAWDDARROWS,可以為某一個按鈕新增下拉按鈕。
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_DRAW_LINE));
dwStyle |= TBSTYLE_DROPDOWN; //
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_DRAW_LINE),dwStyle);
2.新建你要在點選按鈕ID_DRAW_LINE出現的下拉選單,即在工程的Resourceview選擇目錄樹的條目點選右鍵,插入新的Resouse:Menu,在這裡我新建的Menu它的ID是IDR_POPUP_LINE,如下圖所示:
3.在CMainFrame類的訊息對映中(即MainFrm.cpp )加入下拉箭頭的TBN_DROPDOWN訊息對映:
ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown)
如下:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown)//此行即為新增的ON_NOTIFY訊息對映
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4.在MainFrame.h標頭檔案中加入訊息處理函式的宣告:
afx_msg void OnToolbarDropDown(NMHDR* pnmhdr, LRESULT* plRes);
5.在MainFrame.cpp檔案中加入TBN_DROPDOWN訊息處理的實現程式碼:
void CMainFrame::OnToolbarDropDown(NMHDR *pnmhdr, LRESULT *plr)
{
LPNMTOOLBAR pnmtb = reinterpret_cast<LPNMTOOLBAR>(pnmhdr);
CWnd *pWnd;
UINT nID;
switch(pnmtb->iItem)
{
case ID_DRAW_LINE://ID_DRAW_LINE即是你要新增下拉選單的ToolBar按鈕的ID
pWnd = &m_wndToolBar;
nID = IDR_POPUP_LINE;//IDR_POPUP_LINE就是上面新制作的選單ID,當然,如果你要新增多個下拉選單,只要多加幾個case就好了
break;
default:
return;
}
CMenu menu;
menu.LoadMenu(nID);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup);
CRect rc;
pWnd->SendMessage(TB_GETRECT,pnmtb->iItem,(LPARAM)&rc);
pWnd->ClientToScreen(&rc);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left,rc.bottom,this,&rc);
}
執行後如圖:
另外:
ID_DRAW_LINE這個ID的按鈕要求有實現程式碼,可以弄一個空的響應函式。