现在的位置: 首页 > 综合 > 正文

MFC工具栏ToolBar按钮添加下拉菜单

2018年02月12日 ⁄ 综合 ⁄ 共 1725字 ⁄ 字号 评论关闭

 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; //其中ID_DRAW_LINE是你要添加下拉菜单的按钮的ID
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的按钮要求有实现代码,可以弄一个空的响应函数。
 

抱歉!评论已关闭.