VC实现工具栏上的下拉列表

    我们在使用IE6.0时,发现后退和前进后面均有个下拉箭头,点击这些下拉列表就会弹出一些历史链接地址。这种效果我们用VC如何实现呢?

    我们可以分为几步来做。

   第一步.新建一个Single型的MFC工程。在MainFrame.cpp中的OnCreate()return 0前加入如下代码;

   DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
      m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);  

//    这两行代码的作用是让工具栏具有处理下拉箭头的能力,接着要用SetButtonStyle()方法在选定的地方添加下拉箭头按钮,在例子程序里,下拉箭头按钮是加在了文件打开菜单上:

      DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));

      dwStyle |= TBSTYLE_DROPDOWN;

      m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);    

第二步,有了下拉箭头,我们要加入消息映射宏。具体做法是,在MainFrame.cpp中加入下拉箭头的TBN_DROPDOWN消息映射:

     BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

      //{{AFX_MSG_MAP(CMainFrame)

      ...

      ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)

      //}}AFX_MSG_MAP

      END_MESSAGE_MAP()    

第三步, MainFrame.h头文件中加入消息处理函数的声明:

      //{{AFX_MSG(CMainFrame)

         afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);

      //}}AFX_MSG  

第四步,加入菜单。其ID=IDR_MENU1

    FILE菜单,下面加入三个选项,分别为OPEN,SAVE,CLOSE

第五步,实现MAINFRAME.CPPTBN_DROPDOWN()函数:

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);
      }   

第六步,在MainFrame.hMainFrame.cpp分别对File菜单下的三个菜单项添加相关声明和函数。如下

void CMainFrame::OnMenuitem32771()
{
 // TODO: Add your command handler code here
 AfxMessageBox("open a file");

}

void CMainFrame::OnMenuitem32772()
{
 // TODO: Add your command handler code here
  AfxMessageBox("save a file");
}

void CMainFrame::OnMenuitem32773()
{
 // TODO: Add your command handler code here
  AfxMessageBox("close a file");
}

最后,按CTRL+F5运行即可实现

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值