本文通过实例说明MFC工具栏的创建、设计和使用方法,包括三个demo。
demo1:创建一个工具栏
C++代码
- //摘抄自MSDN
- demo1 (创建一个工具栏)
- 1.Create a toolbar resource.
- /*可以先插入一个新的工具栏资源
- 添加分隔符,将按钮向右拖动一小下
- 删除按钮,将按钮拖动出工具栏
- */
- 2.Construct the CToolBar object.
- /*
- 工具栏是 CToolBar 对象,声明为应用程序的 CMainFrame 类的数据成员。也就是说,工具栏对象嵌入到主框架窗口对象中。这意味着 MFC 在创建框架窗口时创建工具栏,在销毁框架窗口时销毁工具栏。
- */
- 3.Call the Create (or CreateEx) function to create
- the Windows toolbar and attach it to the CToolBar object.
- 4.Call LoadToolBar to load the toolbar resource.
- /*
- 工具栏创建发生在 CMainFrame::OnCreate 中。MFC 在创建框架窗口之后且在窗口可见之前调用 OnCreate。
- 在 OnCreate 中调用适当的函数来停靠或浮动工具栏、设置它的样式等。
- 应用程序向导”生成的默认 OnCreate 执行以下工具栏任务:
- 1.调用 CToolBar 对象的 Create 成员函数来创建基础 CToolBarCtrl 对象。
- 2.调用 LoadToolBar 来加载工具栏资源信息。
- 3.调用函数来启用停靠、浮动和工具提示。
- */
- class CMainFrame : public CMDIFrameWnd
- {
- // ...
- // Implementation
- // ...
- protected: // control bar embedded members
- CStatusBar m_wndStatusBar;
- CToolBar m_wndToolBar;
- // Generated message map functions
- protected:
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- DECLARE_MESSAGE_MAP()
- };
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- //框架类中m_wndMyToolBar成员变量先调用CreateEx函数,再调用LoadToolBar函数
- if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
- | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
- ! m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
- {
- TRACE0("Failed to create toolbar ");
- return -1; // fail to create
- }
- //调用CToolBar中的成员函数设置工具栏可停靠的位置
- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
- //调用框架类中的成员函数设置哪里可以被停靠
- EnableDocking(CBRS_ALIGN_ANY);
- //Points to the control bar to be docked.
- DockControlBar(&m_wndToolBar);
- return 0;
- }
demo2:停靠和浮动工具栏
C++代码
- demo2 (停靠和浮动工具栏)
- /*
- 如果使用“应用程序向导”来生成应用程序的主干,向导将要求您选择是否想要可停靠的工具栏。
- 默认情况下,“应用程序向导”生成代码来执行将可停靠工具栏放置在应用程序中所需的三个操作:
- 1.在框架窗口中启用停靠。
- 2.为工具栏启用停靠。
- 3.停靠工具栏(靠向框架窗口)。
- 如果这些步骤中的任何一个缺少,应用程序都将显示标准工具栏。
- 后两个步骤对应用程序中的每一个可停靠工具栏都必须执行。
- */
- CFrameWnd::EnableDocking()//在框架窗口中启用停靠
- /*
- 若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。
- 这可通过使用 CFrameWnd::EnableDocking 函数来实现,该函数采用一个 DWORD 参数,这是一组指示框架窗口的哪一个边接受停靠的样式位。
- 如果一个工具栏即将停靠并且有多个边可以停靠,则在传递给 EnableDocking 的参数中指示的边按以下顺序使用:顶边、底边、左边、右边。
- 如果希望能够将控制条停靠在任意位置,请将 CBRS_ALIGN_ANY 传递给 EnableDocking。
- */
- CControlBar::EnableDocking()//为工具栏启用停靠
- /*
- 准备好停靠目标后,必须以相似的方式准备工具栏(或源)。为想要停靠的每一个工具栏调用 CControlBar::EnableDocking,指定工具栏应停靠的目标边。如果在 CControlBar::EnableDocking 调用中所指定的边没有一个与框架窗口中为停靠启用的边匹配,则工具栏无法停靠(它将浮动)。
- 工具栏一旦浮动,将保持为浮动工具栏,不能停靠到框架窗口。
- 如果希望工具栏永久浮动,请调用参数为 0 的 EnableDocking。然后调用 CFrameWnd::FloatControlBar。工具栏将保持浮动,永远不能在任意位置停靠。
- */
- CFrameWnd::DockControlBar()//停靠工具栏
- /*
- 当用户试图将工具栏放置在允许停靠的框架窗口某一边时,框架调用 CFrameWnd::DockControlBar。
- 另外,可以随时调用该函数将控制条停靠在框架窗口中。这通常在初始化过程中完成。
- 框架窗口的具体某个边上可停靠多个工具栏。
- */
- CFrameWnd::FloatControlBar()//浮动工具栏
- /*
- 从框架窗口分离可停靠工具栏称为浮动工具栏。调用 CFrameWnd::FloatControlBar 来执行该操作。指定要浮动的工具栏、将放置的点以及决定浮动工具栏是水平还是垂直的对齐样式。
- 当用户拖动工具栏离开停靠位置并将它放置在一个未启用停靠的位置时,框架调用该函数。
- 这可以是框架窗口的内部或外部的任意位置。同 DockControlBar 一样,也可以在初始化过程中调用该函数。
- 可停靠工具栏的 MFC 实现不提供一些支持可停靠工具栏的应用程序中有的扩展功能。诸如可自定义工具栏这样的功能不提供。
- */
- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- //...
- //部分代码略
- //...
- //调用CToolBar中的成员函数设置工具栏可停靠的位置
- m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
- //调用框架类中的成员函数设置哪里可以被停靠
- EnableDocking(CBRS_ALIGN_ANY);
- //Points to the control bar to be docked.
- DockControlBar(&m_wndToolBar);
- return 0;
- }
demo3:点击菜单项显示和隐藏工具栏
C++代码
- demo3 (点击菜单项显示和隐藏工具栏)
- CFrameWnd::ShowControlBar//显示和隐藏菜单项
- void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
- void CMainFrame::OnViewNewtool()
- {
- ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制显示和隐藏
- }
- void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//为菜单项打标记
- }
转自:http://www.jizhuomi.com/software/181.html