65.9K
CodeProject 正在变化。 阅读更多。
Home

创建弹出工具栏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (9投票s)

2001年11月1日

3分钟阅读

viewsIcon

185565

downloadIcon

5308

将子工具栏附加到另一个工具栏的按钮上。如果用户在该按钮上停留稍微长一点的时间,则会弹出子工具栏

Sample Image - FOToolBar.jpg

引言

本文展示了如何创建飞出工具栏。飞出工具栏例如在 3D Studio 和 AutoCAD 中使用。

其理念是让用户选择可以执行的更“通用”操作的子选项。例如,如果我们正在编写一个 2D 图形编辑器,并且我们有一个“绘制矩形”选项,我们可能会在工具栏上有一个显示矩形的按钮。但问题是什么样的矩形?填充矩形?只有边框?还是两者都有?

解决这个问题的一个方法是创建另一个“飞出”工具栏,显示所有“绘制矩形”的子选项,如果用户在工具栏上的“绘制矩形”按钮上停留稍微长一点的时间,则该工具栏将弹出在旁边。如果用户从飞出工具栏中选择了不同的子选项,则主工具栏上的按钮会自动更新。

CFOToolBar 类正是这样做的。它派生自 CToolBar,并且有一个额外的成员函数 addFlyout(),该函数接受工具栏上按钮的从零开始的索引,以及要附加到该按钮的飞出工具栏的资源 ID。

用法

为了使用 CFOToolBar,只需执行以下步骤

1. 使用资源编辑器创建另一个工具栏,其中将包含所有子选项(在这种情况下,包含不同矩形的工具栏 Flyout Toolbar。假设它的资源 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.cppFOToolBar.h 添加到您的项目中。

就是这样。

现在,如果您在工具栏上的第一个按钮上停留稍微长一点的时间,您将看到“矩形”飞出工具栏弹出。

工作原理

通过重写主工具栏的 ON_WM_LBUTTONDOWN() 消息,我们可以做两件事

1. 检查用户是否单击了我们先前附加了飞出工具栏的按钮。

2. 如果是,则启动 X 毫秒的计时器。在计时器函数中,我们创建飞出工具栏并将其显示在正确的位置。飞出工具栏也派生自 CToolBar。我们所要做的就是简单地删除标题并使其浮动。

但是,在显示飞出工具栏时存在一些问题。它没有收到任何鼠标消息,因为主工具栏收到了它们。这就是我们还必须重写 ON_WM_MOUSEMOVE() 以检测是否显示了飞出工具栏,如果是,则将其消息委托给它的原因。

我们还重写了 ON_WM_LBUTTONUP(),在其中我们停止计时器并在必要时更新来自飞出的新按钮。

如果用户在飞出工具栏显示时更改应用程序(通过单击 Ctrl+Alt),并在另一个应用程序中松开鼠标,则会发生一个奇怪的副作用。当返回时,主工具栏和飞出工具栏都不会收到 ON_WM_LBUTTONUP() 消息,因此您会看到飞出工具栏仍然显示,直到您实际单击其按钮之一。

这些是实现的主要指南。有关更具体的详细信息,请查看代码,并随时通过电子邮件向我提出问题或建议。

© . All rights reserved.