在现代应用程序中,用户界面的灵活性和可定制性是至关重要的。本文将介绍如何开发一个可调整大小的控制条,该控制条既可以在对接状态也可以在浮动状态下调整大小,并且支持状态持久化。将探讨如何实现这些功能,并提供一些高级示例,以帮助更好地理解如何使用这些类。
在开始之前,需要将一些关键的文件包含到项目中。这些文件提供了控制条的基本功能和可调整大小的特性。以下是需要包含的文件:
#include "sizecbar.h"
#include "sizecbar.cpp"
#include "scbarg.h"
#include "scbarg.cpp"
接下来,需要在项目的预编译头文件(例如 stdafx.h
)中添加这些包含指令。如果文件位于不同的目录中,请包含相应的路径。
要创建一个控制条,需要从 CSizingControlBarG
类派生一个类。在主框架头文件(例如 mainfrm.h
)中包含类的头文件,然后向主框架类添加一个成员变量:
#include "mybar.h"
CMyBar m_wndMyBar;
在主框架的 OnCreate()
方法中创建控制条,并设置其样式和对接功能:
if (!m_wndMyBar.Create(_T("My Bar"), this, 123)) {
TRACE0("Failed to create mybar\n");
return -1; // 创建失败
}
m_wndMyBar.SetBarStyle(m_wndMyBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndMyBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyBar, AFX_IDW_DOCKBAR_LEFT);
上述说明将创建一个带有类似DevStudio的控制条,当对接时有一个带有两条凸起线和一个隐藏按钮的控制条,当浮动时则没有控制条。现在,将探索一些高级功能。将使用 CSizingControlBarCF
类作为基类,并在浮动状态下隐藏miniframe标题,同时显示控制条的控制条。这是因为 CSizingControlBarCF
的控制条看起来像一个小标题。使用自定义miniframe类的一个副作用是,如果启用了“拖动时显示窗口内容”的显示属性,浮动条的调整将是动态的。
将这些文件添加到项目中:
#include "scbarcf.h"
#include "scbarcf.cpp"
修改 stdafx.h
文件,使其看起来像这样:
#define _SCB_REPLACE_MINIFRAME
#include "sizecbar.h"
#include "scbarg.h"
#include "scbarcf.h"
#define baseCMyBar CSizingControlBarCF
在 CMainFrame::OnCreate()
中,在 EnableDocking()
调用之后添加这些行:
#ifdef _SCB_REPLACE_MINIFRAME
m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
#endif //_SCB_REPLACE_MINIFRAME
这些类旨在作为基类使用。不要简单地将代码添加到文件中,而是创建一个从 CSizingControlBarG
或 CSizingControlBarCF
派生的类,并将需要的内容放入其中。如果想要自定义控制条,或者根本不想要控制条,可以使用 CSizingControlBar
作为基类。
使用范围在 AFX_IDW_CONTROLBAR_FIRST + 32 .. AFX_IDW_CONTROLBAR_LAST
内的ID是必需的,只有当条不会启用对接时(即,它将固定在框架菜单的正下方)。但在这种情况下,将无法充分利用这个类的功能,所以如果启用它对接(一个合理的猜测 :)),那么可以使用任何有效的窗口ID。
另一个ID很重要的地方是保存/加载条的状态。必须为每个启用对接的控制条使用不同的ID,这也包括其他条。例如,如果有两个工具栏,可以创建第一个工具栏使用默认ID(即 AFX_IDW_TOOLBAR = AFX_IDW_CONTROLBAR_FIRST
),但第二个必须有一个不同的ID。
此功能允许在调整大小时重新绘制条。此外,如果需要,所有条都会重新定位和重新绘制。
此功能通过查询系统参数 SPI_GETDRAGFULLWINDOWS
来实现(它通过在显示属性中勾选“拖动时显示窗口内容”复选框来启用)。
此条样式需要 CBRS_SIZE_DYNAMIC
。确保将其添加到条中,否则当用户浮动条时应用程序将崩溃。可以在 Create()
之后使用 SetBarStyle()
添加它,或者通过更改 Create()
的默认样式为类似:
WS_VISIBLE|WS_CHILD|CBRS_TOP|CBRS_SIZE_DYNAMIC
公共MFC控制条的对接状态使用 CMainFrame::SaveBarState()
保存。除了这个函数保存的信息外,CSizingControlBar
类需要保存3个大小。这是在 CSizingControlBar::SaveState()
函数中完成的,因此需要调用 m_wndMyBar.SaveState()
。请注意,状态存储代码必须放置在 CMainFrame
的 OnClose()
或 DestroyWindow()
中,而不是 OnDestroy()
中,因为在接收到 WM_DESTROY
消息时,浮动条已经被销毁了。
在 CMainFrame::OnCreate()
中,m_wndMyBar.LoadState()
调用必须放置在 LoadBarState()
之前。
或者,如果有多个可调整大小的条,可以调用一次静态成员 SizingControlBar::GlobalSaveState()
而不是调用每个条的 SaveState()
。对于 LoadState()
也是如此 - 有一个 CSizingControlBar::GlobalLoadState()
函数。在这两个示例中查看更多详细信息。
有两个符号可以定义,以使浮动条具有不同的外观和功能:
_SCB_REPLACE_MINIFRAME
可用于插入 CSCBMiniDockFrameWnd
,这是一个自定义miniframe类。使用这个类的主要好处是浮动条可以像所有其他窗口一样动态调整大小。另一个好处是miniframe标题可以关闭,允许条显示自己的控制条,以增加功能和/或自定义设计。_SCB_MINIFRAME_CAPTION
只能在前一个标志也被定义的情况下定义。它会导致自定义miniframe保留工具窗口标题。