Visual Studio界面
Visual Studio的界面如下,很多人喜欢这种界面风格,尤其是主框架下的两个活动窗口:左侧为嵌套Tab控件的浮动窗口,底部为嵌套信息输出窗口的浮动窗口。这种浮动窗口类似于可浮动的工具栏,可以停靠在主窗口的任意一边,也可以浮动在主窗口内的任何位置,窗口的大小可以随鼠标的拖动而改变,还可以关闭和重新打开。
在MFC中,具有浮动性能的窗口都由一个共同的基类--控制条类CControlBar类派生,如工具栏类CToolBar、状态栏类CStatusBar和对话条类CDialogBar都是这样的。在这些派生类中,根据需要对CControlBar的默认属性作了修改,并增加了自己的特性,如在CStatusBar中限定了状态栏只能水平排列,而不能垂直排列。可以将这些在CcontrolBar基础上派生的类统称为控制条窗口。控制条窗口通常是一个与视图窗口处于同一级的框架类的子窗口。它通过获得父框架窗口的客户区(Client Area)的位置信息来计算自己的尺寸和位置,并通知父框架窗口剩下的客户区的位置和尺寸。控制条之间名于互相覆盖,且不会遮盖视力窗口。
注意:容易被忽视的一点,控制条能够沿框架窗口停靠取决于框架窗口沿边框四周创建的4个统一的控制条,即停靠栏。没有控制条来停靠时,停靠栏沿应用程序主窗口缩小到不可见,当控制条停靠在边框时,停靠栏就展开并包围这些控制条。
CFrameWnd的成员函数EnableDocking()沿框架窗口创建这4个停靠栏。但是,停靠功能不是自动地被MFC启动的,在CMainFrame::OnCreate()中,需要调用EnableDocking()才能进行工具栏的停靠操作。几个与停靠相关的函数是:
CFrameWnd::EnableDocking() 沿框架四周创建停靠栏。
CControlBar::EnableDocking() 设置控制条的停靠属性
CFrameWnd::DockControlBar() 将一个控制条停靠到一个停靠栏中
如CMainFrame::OnCreate()中关于工具栏的停靠代码
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
.....
//允许工具栏停靠
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.SetWindowText("Standard Tool");
//在主框架窗口四周创建停靠栏
EnableDocking(CBRS_ALIGN_ANY);
//将控制条停靠到停靠栏,默认为停靠到上边
DockControlBar(&m_winToolBar);
或 DockControlBar(&m_winToolBar,AFX_IDW_DOCKBAR_TOP);
......
}
CCoolDialog类
创建这种类型的窗口,可以自己用CControBar类开发。当然,有现成的为什么不用呢?这里介绍Mr. Oliver Smith开发的CCoolDialogBar类。
Oliver Smith 的程序库中共有5个类:
1. CCoolDialogBar是最基本的类,直接从CControlBar中派生出来的,创建和管理停靠窗口。
2. CTabSheetDockBar实现左侧Tab窗口的创建和管理,从CCoolDialogBar派生出来。在DockTool.h中声明
3. CMessageViewDockBar实现底端窗口的创建和管理,从CCoolDialogBar派生出来。在DockTool.h中声明
4. CTabSheet实现左侧停靠窗口内的Tab创建和管理,它的基类是CTabCtrl。
5. COutputView实现在底部停靠窗口内字符串的输出管理,基类是SCrollView。
使用方法:
Oliver Smith的程序可以编译成一个DLL库。包含DockTool.dll,