1. 程式人生 > >MFC工具欄ToolBar按鈕新增下拉選單

MFC工具欄ToolBar按鈕新增下拉選單

1.MainFrm.cppint 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; //

其中ID_DRAW_LINE是你要新增下拉選單的按鈕的ID
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_DRAW_LINE),dwStyle);

2.新建你要在點選按鈕ID_DRAW_LINE出現的下拉選單,即在工程的Resourceview選擇目錄樹的條目點選右鍵,插入新的ResouseMenu,在這裡我新建的Menu它的IDIDR_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的按鈕要求有實現程式碼,可以弄一個空的響應函式。