工具条研究手记 -工具条下拉按钮的实现

/有些工具条的按钮是一个下拉按钮,用户点这个工具条以后,弹出一个下拉菜单。这种按钮如何设置,
并且如何响应呢?


下拉按钮有两种样式:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值