WTL 停靠窗口






4.89/5 (68投票s)
2002年2月7日
7分钟阅读

953527

14213
这是 WTL 库的停靠窗口实现。
简介。
这是 WTL 库的停靠窗口实现。以下主题描述了如何使用停靠窗口类。
预构建设置。
- 确保所有头文件都放置在适当的位置,并且编译器可以访问它。
- 将
DockImpl.cpp
添加到项目中。最好的方法可能是将#include"DockImpl.cpp"
添加到stdafx.cpp
。 - 停靠窗口使用 STL,因此需要启用异常处理(
/GX
或/EH
编译器选项),并在发布配置的预处理器定义列表中删除_ATL_MIN_CRT
。如果您使用标准的 HP STL,可以保留默认的项目设置,但我认为这并不是一个好主意。 - 如果您使用 boost 库,请定义
USE_BOOST
。 - 我使用了一些私有消息,范围从
WM_USER
到WM_USER + 2
WMDF_FIRST = WM_USER
WMDF_LAST = WM_USER + 2
WMDF_LAST+1
,如果不可能,则重新定义WMDF_FIRST
。
为主框架添加停靠窗口功能支持
- 使用 ATL/WTL AppWizard 创建一个新项目(MDI 或 SDI,随您喜欢)
- 将
#include "DockingFrame.h"
添加到CMainFrame
头文件中。 - 将您的
CMainFrame
类的基类更改为 SDI 应用程序的dockwins::CDockingFrameImpllt;CMainFramegt;
,或 MDI 应用程序的dockwins::CMDIDockingFrameImpllt;CMainFramegt;
。之前所有基类的引用都应替换为新的。 - 在您的
CMainFrame
类的OnCreate
方法中添加InitializeDockingFrame()
;这是更改停靠窗口行为的最佳位置。默认情况下,它取决于系统设置(拖动时显示窗口内容),如果您出于某种原因需要更改它,应使用以下标志CDockingBarStyle::sUseSysSettings
— 取决于系统设置,默认。CDockingBarStyle::sIgnoreSysSettings | CDockingBarStyle::sFullDrag
— 完全拖动CDockingBarStyle::sIgnoreSysSettings | CDockingBarStyle::sGhostDrag
— 虚影拖动。
如果您使用自动隐藏功能,还可以使用以下标志CDockingBarStyle::sAnimation
— 动画显示自动隐藏窗口。CDockingBarStyle::sNoAnimation
— 不动画显示自动隐藏窗口。
实现一个停靠窗口
- 将
#include "ExtDockingWindow.h"
添加到您的停靠窗口的头文件中。 - 创建一个新类,例如
CSampleDockingWindow
。将其从dockwins::CTitleDockingWindowImpl
派生。 - 添加消息映射和
DECLARE_WND_CLASS
宏。CSampleDockingWindow 类应该如下所示:class CSampleDockingWindow : public dockwins::CTitleDockingWindowImpl< SampleDockingWindow, CWindow, dockwins::COutlookLikeTitleDockingWindowTraits > { typedef CSampleDockingWindow thisClass; typedef dockwins::CTitleDockingWindowImpl<CSAMPLEDOCKINGWINDOW, CWINDOW, dockwins::COutlookLikeTitleDockingWindowTraits> baseClass; public: DECLARE_WND_CLASS(_T("CSampleDockingWindow")) BEGIN_MSG_MAP(thisClass) CHAIN_MSG_MAP(baseClass) END_MSG_MAP() };
- 在
CMainFrame
的成员中实例化一个CSampleDockingWindow
类的对象。 - 在
CMainFrame::OnCreate(...)
方法中,调用实例化的停靠窗口类的Create(...)
方法。LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { ... InitializeDockingFrame(); ... CRect rcBar(0,0,100,100); m_sampleDockWnd.Create(m_hWnd,rcBar,_T("Sample docking window")); ... }
即使您停靠窗口,也不要使用空矩形。当窗口开始拖动时,它会使用先前存储的浮动矩形大小。
为通用窗口添加停靠窗口功能支持
要实现具有停靠窗口功能的窗口,请从 dockwins::CDockingSiteImpl
派生一个类。在派生类中,将默认消息映射链式调用到基类。
class CDockSiteSampleWnd : public dockwins::CDockingSiteImpl <
CDockSiteSampleWnd >
{
typedef dockwins::CDockingSiteImpl < CDockSiteSampleWnd > baseClass;
public:
DECLARE_WND_CLASS(_T("CDockSiteSampleWnd"))
BEGIN_MSG_MAP(CDockSiteSampleWnd)
CHAIN_MSG_MAP(baseClass)
END_MSG_MAP()
};
添加对选项卡式停靠窗口的支持
- 选项卡式停靠窗口依赖于 Daniel Bowen 的 CodeProject 文章“自定义选项卡控件、选项卡式框架和选项卡式 MDI”,请下载该文章的源代码。
- 将您的停靠窗口的基类从
dockwins::CTitleDockingWindowImpl
更改为dockwins::CBoxedDockingWindowImpl
。 - 将以下类用作
dockwins::CBoxedDockingWindowImpl
的特性:COutlookLikeBoxedDockingWindowTraits
、COutlookLikeExBoxedDockingWindowTraits
或CVC6LikeBoxedDockingWindowTraits
。 - 要向之前的
CSampleDockingWindow
类添加选项卡式停靠功能支持,代码应如下所示:class CSampleTabDockingWindow : public dockwins::CBoxedDockingWindowImpl< SampleDockingWindow, CWindow, dockwins::COutlookLikeBoxedDockingWindowTraits > { typedef CSampleTabDockingWindow thisClass; typedef dockwins::CBoxedDockingWindowImpl<CSAMPLEDOCKINGWINDOW, CWINDOW, dockwins::COutlookLikeBoxedDockingWindowTraits> baseClass; public: DECLARE_WND_CLASS(_T("CSampleTabDockingWindow")) BEGIN_MSG_MAP(thisClass) CHAIN_MSG_MAP(baseClass) END_MSG_MAP() };
添加对自动隐藏功能的支持
要为您的项目添加自动隐藏功能,只需在任何其他停靠窗口头文件之前包含 DWAutoHide.h
头文件。
停靠一个停靠窗口
从您的框架窗口类调用 DockWindow
方法。
template<class T>
bool DockWindow(T& dockWnd,CDockingSide side,
unsigned long nBar,float fPctPos,
unsigned long nWidth, unsigned long nHeight);
- dockWnd
- 停靠窗口。
- side
- 停靠到的框架窗口的边。
CDockingSide::sSingle
强制停靠窗口完全占用停靠栏的宽度,将此样式与以下任一样式结合使用CDockingSide::sRight
停靠到框架窗口的右侧。CDockingSide::sLeft
停靠到框架窗口的左侧。CDockingSide::sTop
停靠到框架窗口的顶部。CDockingSide::sBottom
停靠到框架窗口的底部。 - nBar
- 要停靠到的停靠栏的索引,从零开始。
- fPctPos
- 停靠窗口应使用的停靠栏宽度的百分比,作为顶部点。
- nWidth
- 停靠窗口的请求宽度(以像素为单位)。如果停靠窗口是垂直的,此参数实际上表示控件栏的高度。
- nHeight
- 停靠窗口的请求高度(以像素为单位)。如果停靠窗口是垂直的,此参数实际上表示控件栏的宽度。
将一个选项卡式停靠窗口停靠到另一个
调用选项卡式停靠窗口的 DockTo
方法。
bool DockTo(HWND hWnd,int index=0);
- hWnd
- 要停靠到的选项卡式停靠窗口。
- index
- 零基索引。
浮动一个已停靠的停靠窗口
从您的停靠窗口类调用 Float
方法。
bool Float()
- 恢复先前的浮动位置bool Float(LPCRECT pRc,
- 浮动停靠窗口并将其移动到指定位置。
UINT flags=SWP_SHOWWINDOW | SWP_NOACTIVATE,
HWND hWndInsertAfter=HWND_TOP)
固定停靠窗口
调用选项卡式停靠窗口的 PinUp
方法之一。
bool PinUp(const CDockingSide& side);
bool PinUp(const CDockingSide& side, unsigned long width,
bool bVisualize=false);
- side
- 要固定到的框架窗口的边。
CDockingSide::sRight
固定到框架窗口的右侧。CDockingSide::sLeft
固定到框架窗口的左侧。CDockingSide::sTop
固定到框架窗口的顶部。CDockingSide::sBottom
固定到框架窗口的底部。 - width
- 停靠窗口的请求宽度(以像素为单位)。
- bVisualize
- 指定固定后停靠窗口的显示状态。
取消固定已固定的停靠窗口
调用已固定窗口的 Hide
然后 Show
方法来模拟按下固定按钮,
或调用 Float
方法浮动一个已固定的停靠窗口,
或调用 Hide
方法然后调用任何设置停靠窗口位置的函数。
接收停靠窗口停靠状态更改的通知
重写您的停靠窗口类的以下成员函数
void OnDocked(HDOCKBAR hBar,bool bHorizontal)
void OnUndocked(HDOCKBAR hBar)
- hBar
- 要停靠到的停靠栏的句柄。
- bHorizontal
- 停靠窗口方向。
隐藏/显示停靠窗口
要隐藏/显示停靠窗口,只需调用 CTitleDockingWindowImpl
类的 Hide()
/ Show()
或 Togle()
方法。
指定最小停靠窗口大小
您可以通过重写停靠窗口的 GetMinMaxInfo
方法来指定最小停靠窗口大小,如下所示:
void GetMinMaxInfo(LPMINMAXINFO pMinMaxInfo) const
{
pMinMaxInfo->ptMinTrackSize.y=100;
pMinMaxInfo->ptMinTrackSize.x=100;
}
保存停靠窗口位置
您可以使用 CDockingWindowBaseImpl
类的以下成员函数:
bool GetDockingWindowPlacement(DFDOCKPOSEX* pHdr) const
bool SetDockingWindowPlacement(DFDOCKPOSEX* pHdr)
替换分隔条
如果您不喜欢分隔条,可以创建自己的。如果您只想更改其外观,最好的方法是从 CSimpleSplitterBar
派生。并重写 Draw()
、DrawGhostBar()
等。然后定义您的特性
typedef CDockingFrameTraitsT <CMySplitterBar,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
WS_EX_APPWINDOW | WS_EX_WINDOWEDGE> CMyDockingFrameTraits;
并将其应用于 CMainFrame
的基类。创建自定义标题栏
创建一个新的标题栏类。您可以从 CCaptionBase
或其他可用的标题栏类派生。然后定义 DockingWindowTraits
typedef CDockingWindowTraits<CMyCaption,
WS_OVERLAPPEDWINDOW | WS_POPUP | WS_VISIBLE |
WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
WS_EX_TOOLWINDOW> CMyTitleDockingWindowTraits;
并将其应用于 CTitleDockingWindowImpl
。
停靠窗口类
停靠窗口框架类
CDockingFrameImplBase
[DockingFrame.h]
— 此类提供基本的停靠窗口功能。CDockingFrameImpl [DockingFrame.h]
— 单文档界面 (SDI) 框架窗口的基类。CMDIDockingFrameImpl [DockingFrame.h]
— 多文档界面 (MDI) 框架窗口的基类。CDockingSiteImpl [DockingFrame.h]
— 具有停靠窗口功能的通用窗口的基类。CDockingFrameTraitsT [DockMisc.h]
— 停靠框架的特性,它派生自CWinTraits
类并添加TSplitterBar
参数。
停靠窗口类
CDockingWindowBaseImpl [DockingWindow.h]
— 停靠窗口的基类。CDockingWindowBaseImpl
类派生自CWindowImpl
,并具有相同的参数,除了TWinTraits
。而是使用CDockingWindowTraits
。CTitleDockingWindowImpl [DockingWindow.h]
— 带标题的停靠窗口。CBoxedDockingWindowImpl [DockingBox.h]
— 带标题的停靠窗口,支持选项卡式停靠。CDockingWindowTraits [DockingWindow.h]
— 停靠窗口的特性,它派生自CWinTraits
类并添加TCaption
参数。如果您需要自定义停靠窗口标题栏,请创建新的标题栏类,并使用CDockingWindowTraits
和新类作为TCaption
参数。
停靠窗口标题栏类
CCaptionBase[DockingWindow.h]
— 其他标题栏类的基类COutlookLikeExCaption
和COutlookLikeCaption [ExtDockingWindow.h]
— 类似 Microsoft Outlook™ 的标题栏。COutlookLikeCaption
— 始终为水平标题栏。COutlookLikeExCaption
— 标题栏的方向取决于停靠位置。CVC6LikeCaption [ExtDockingWindow.h]
— 类似 Microsoft Visual C++ 6™ IDE 的标题栏。
停靠窗口特性类
COutlookLikeTitleDockingWindowTraits [ExtDockingWindow.h]
—COutlookLikeCaption
的特性,将此类与CTitleDockingWindowImpl
一起使用COutlookLikeExTitleDockingWindowTraits [ExtDockingWindow.h]
—COutlookLikeExCaption
的特性,将此类与CTitleDockingWindowImpl
一起使用CVC6LikeTitleDockingWindowTraits [ExtDockingWindow.h]
—CVC6LikeCaption
的特性,将此类与CTitleDockingWindowImpl
一起使用COutlookLikeBoxedDockingWindowTraits [TabDockingBox.h]
—COutlookLikeCaption
的特性,将此类与CBoxedDockingWindowImpl
一起使用COutlookLikeExBoxedDockingWindowTraits [TabDockingBox.h]
—COutlookLikeExCaption
的特性,将此类与CBoxedDockingWindowImpl
一起使用CVC6LikeBoxedDockingWindowTraits[TabDockingBox.h]
—CVC6LikeCaption
的特性,将此类与CBoxedDockingWindowImpl
一起使用
停靠窗口分隔条类
CSimpleSplitterBar[SimpleSplitterBar.h]
- 非常简单的分隔条。CSimpleSplitterBarEx[SimpleSplitterBar.h]
- 另一个简单的分隔条。