创建弹出工具栏






4.88/5 (9投票s)
2001年11月1日
3分钟阅读

185565

5308
将子工具栏附加到另一个工具栏的按钮上。如果用户在该按钮上停留稍微长一点的时间,则会弹出子工具栏
引言
本文展示了如何创建飞出工具栏。飞出工具栏例如在 3D Studio 和 AutoCAD 中使用。
其理念是让用户选择可以执行的更“通用”操作的子选项。例如,如果我们正在编写一个 2D 图形编辑器,并且我们有一个“绘制矩形”选项,我们可能会在工具栏上有一个显示矩形的按钮。但问题是什么样的矩形?填充矩形?只有边框?还是两者都有?
解决这个问题的一个方法是创建另一个“飞出”工具栏,显示所有“绘制矩形”的子选项,如果用户在工具栏上的“绘制矩形”按钮上停留稍微长一点的时间,则该工具栏将弹出在旁边。如果用户从飞出工具栏中选择了不同的子选项,则主工具栏上的按钮会自动更新。
CFOToolBar
类正是这样做的。它派生自 CToolBar
,并且有一个额外的成员函数 addFlyout()
,该函数接受工具栏上按钮的从零开始的索引,以及要附加到该按钮的飞出工具栏的资源 ID。
用法
为了使用 CFOToolBar
,只需执行以下步骤
1. 使用资源编辑器创建另一个工具栏,其中将包含所有子选项(在这种情况下,包含不同矩形的工具栏 。假设它的资源 ID 是
IDR_RECTANGLE_TOOLBAR
)
2. 从 CFOToolBar
派生您的主工具栏(或直接使用它而不是从它派生)
在 MainFrm.h 中(在类 CMainFrame
中)
... protected: // control bar embedded members CFOToolBar m_wndToolBar;
3. 调用主工具栏对象的 addFlyout()
成员函数,将飞出工具栏附加到所需的按钮。
在 MainFrm.cpp 中(在 OnCreate()
中)
... // add the flyout to the first button on the toolbar m_wndToolBar.addFlyout(0, IDR_RECTANGLE_TOOLBAR); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); ...
4. 将 FOToolBar.cpp 和 FOToolBar.h 添加到您的项目中。
就是这样。
现在,如果您在工具栏上的第一个按钮上停留稍微长一点的时间,您将看到“矩形”飞出工具栏弹出。
工作原理
通过重写主工具栏的 ON_WM_LBUTTONDOWN()
消息,我们可以做两件事
1. 检查用户是否单击了我们先前附加了飞出工具栏的按钮。
2. 如果是,则启动 X 毫秒的计时器。在计时器函数中,我们创建飞出工具栏并将其显示在正确的位置。飞出工具栏也派生自 CToolBar
。我们所要做的就是简单地删除标题并使其浮动。
但是,在显示飞出工具栏时存在一些问题。它没有收到任何鼠标消息,因为主工具栏收到了它们。这就是我们还必须重写 ON_WM_MOUSEMOVE()
以检测是否显示了飞出工具栏,如果是,则将其消息委托给它的原因。
我们还重写了 ON_WM_LBUTTONUP()
,在其中我们停止计时器并在必要时更新来自飞出的新按钮。
如果用户在飞出工具栏显示时更改应用程序(通过单击 Ctrl+Alt),并在另一个应用程序中松开鼠标,则会发生一个奇怪的副作用。当返回时,主工具栏和飞出工具栏都不会收到 ON_WM_LBUTTONUP()
消息,因此您会看到飞出工具栏仍然显示,直到您实际单击其按钮之一。
这些是实现的主要指南。有关更具体的详细信息,请查看代码,并随时通过电子邮件向我提出问题或建议。