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的按钮要求有实现代码,可以弄一个空的响应函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值