/有些工具条的按钮是一个下拉按钮,用户点这个工具条以后,弹出一个下拉菜单。这种按钮如何设置,
并且如何响应呢?
下拉按钮有两种样式:
1、在按钮的右边显示箭头,两者之间有间隔,单击按钮的时候象其它正常
按钮一样,发送的是WM_COMMAND消息,只有在单击箭头的时候才发送TBN_DROPDOWN 消息,弹出下拉
菜单。这种按钮使用比较多,需要 4.72 版(IE 4.01 和Win98以后)支持。
2、在按钮的图案右边显示一个箭头,单击按钮的时候,整个按钮都下沉,并且弹出下拉菜单。需要
添加BTNS_WHOLEDROPDOWN属性,版本要求比较高,需要 5.80版Comctl32.dll(IE 5)支持。
下面是设置第一种按钮样式的代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
。。。//m_wndToolBar已经生成
//需要加上扩展属性TBSTYLE_EX_DRAWDDARROWS
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//根据ID获得按钮的样式
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
//添加下拉按钮样式
dwStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);
return 0;
}
下拉按钮的箭头被按下以后,按钮会发送TBN_DROPDOWN消息给父窗口。形式和WM_NOTIFY一样,其lParam参数是一个NMTOOLBAR结构的指针,具体结构的内容可以参考msdn。这个结构里面包含了一些关于这个通知消息的信息,通常仅仅 hdr 和 iItem 成员有效。可以这样添加代码响应这个消息:
class CMainFrame : public CMDIFrameWnd
{
......
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
......
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);//消息响应函数
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// MainFrm.cpp : implementation of the CMainFrame class
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
......
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
CWnd *pWnd;
UINT nID;
// 根据下拉按钮id的不同,做不同的处理
switch (pnmtb->iItem)
{
case ID_FILE_OPEN:
pWnd = &m_wndToolBar;
nID = IDR_MENU1;
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);
}
//--------------------------------------
// End