如何实现工具栏的下拉箭头按钮

2016-01-29 12:02 219 1 收藏

如何实现工具栏的下拉箭头按钮,如何实现工具栏的下拉箭头按钮

【 tulaoshi.com - C语言心得技巧 】

如何实现工具栏的下拉箭头按钮


作者/NorthTibet

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载源代码

论坛中有人曾经问过这样的问题:如何在C++/MFC程序中实现类似IE工具栏中带下拉箭头的按钮,如图一所示:


图一 IE工具栏中带下拉箭头的按钮

本文将告诉你如何实现,方法其实很简单:
1、新建一个MFC/SDI工程,一路都取默认的设置。
2、在mainframe.cpp文件中找到 CMainFrame::OnCreate()框架窗口创建函数。在末尾添加如下代码行:

      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);      
加了上述代码行之后,编译一次程序,然后运行程序,你就可以看到下拉箭头了。但此时还不能操作。

3、接下来要做的事情是添加下拉箭头的消息处理代码以及程序要用的菜单资源。现在假设你已经创建了菜单资源,且假设这个菜单的资源ID是IDR_MENU1。如图二所示。


                              图二 新创建的菜单资源IDR_MENU1

在CMainFrame类的消息映射中加入下拉箭头的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()      
4、在MainFrame.h头文件中加入消息处理函数的声明:
      //{{AFX_MSG(CMainFrame)      ...      afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);      //}}AFX_MSG     
5、在MainFrame.cpp文件中加入TBN_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);      }      
6、前面第三步创建的菜单资源里有三个菜单命令,“最近打开的文件”、“打开关于对话框”、“VC知识库主页”。它们对应的菜单ID为:ID_FILE_MRU_FILE1、ID_APP_ABOUT、ID_VCKBASE_HOME,前两个ID都是MFC默认的菜单,它们调用的命令函数在例子程序中也是MFC自动创建和调用的。ID_VCKBASE_HOME菜单项在例子程序中是通过ClassView关联到视图类进行处理的,用户选择这个菜单项时调用OnGotoVckbaseHomePage():
      void CMyView::OnGotoVckbaseHomePage()       {        // TODO: Add your command handler code here        ShellExecute(NULL,"open","http://www.vckbase.com",NULL,NULL,SW_SHOWNORMAL);      }     
它打开默认的浏览器并访问VC知识库主页。

好了,现在编译并运行程序吧。下面是例子程序运行画面(图三):<

来源:http://www.tulaoshi.com/n/20160129/1484303.html

延伸阅读
1.打开注册表编辑器,找到HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerToolbar   2.找到Toolbar中的Explorer子键,把二进制值ITBarLayout删除。然后关闭,重新打开IE看下问题是不是解决了。   3.没有解决的话,再打开注册表编辑器。再定位HKEY_CURRENT_USERSoftwareMicr...
一、前 言 对于工具栏,我想大家一定不陌生,它直观,使用方便,它给应用程序的用户带来极大的方便.对VC++程序员来说,为自己开发的软件加上一个工具栏并不难,几乎每本介绍VC++的书都少不了介绍这方面的内容,并且,如果在开发初期就想加入工具栏的话,就更简单了,MFC 可自动为您生成工具栏.可是我们所说的这些工具栏都有一个共同...
标签: 电脑入门
工具栏怎么还原?或许你一不小心的操作就把工具栏隐藏了,或者工具栏遇到其他问题,那么应该怎么做才能把工具栏还原呢? 在任务栏右键 工具栏把快速启动栏语言栏去勾钩。 鼠标移到任务栏边缘出现上下移动的箭头然后下拉即可 然后在锁定把快速启动栏语言栏的钩打上。 还有一种情况就是任务栏损坏了,任务栏损坏的话有三种解决方法: 1)系统...
在任何 Office Professional 2007 程序中,一项最常执行的操作是设置文本格式。在早期版本的 Access 中,设置文本格式通常需要使用菜单或显示“设置格式”工 具栏。使用 Office Access 2007,可以使用微型工具栏更加轻松地设置文本格式。选择要设置格式的文本后,微型工具栏会自动出现在所选文本的上方。如果将鼠标指针靠近微型工具栏, 则...
标签: 电脑入门
方法一、如果在Excel2003视图中有其他工具栏,可以把鼠标移到其中一个工具栏上,然后右击鼠标,出现所有工具栏,你可以选择要显示或隐藏的工具栏,如图所示: 方法二、如果窗口中没有任何工具栏,那么就选择视图菜单中选择工具栏命令,在弹出的子菜单中选择需要显示的工具栏选项,其中可设置具体隐藏和显示的工具栏选项,如图所示: 方...

经验教程

531

收藏

72
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部