正常工具栏不支持按钮的下拉功能。
但有时我们会将相似功能的多个按钮集合放在一起,集中起来更好操作。
这样我们就可以通过下拉的形式,让用户选择不同按钮,进而实现相似功能。
这个例程实现工具栏下拉按钮功能,效果如图
点击工具栏上的下拉按钮,可以打开其他按钮
上位机MFC工具栏实现下拉按钮
下载地址:
实现过程
首先,在调用CMainFrame::OnCreate()创建了工具条后,需要调用下面的方法:
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
这将使得你的工具条处理下拉箭头。下一步要做的事情是:to actually add the drop arrow to your desired button. This will be done via the SetButtonStyle() method:
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
dwStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);
现在,需要为下拉箭头提供一个消息处理函数,以及应用程序菜单资源。
增加下面代码到 CMainFrame消息循环中:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
...
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
增加下面方法到CMainFrame的实现文件中:
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
CWnd *pWnd;
UINT nID;
// Switch on button command id's.
switch (pnmtb->iItem)
{
case ID_FILE_OPEN:
pWnd = &m_wndToolBar;
nID = IDR_MENU1;
break;
default:
return;
}
// load and display popup menu
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);
}
增加下面内容到CMainFrame的头文件中:
//{{AFX_MSG(CMainFrame)
...
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
//}}AFX_MSG
|