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

WTL 停靠窗口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (68投票s)

2002年2月7日

7分钟阅读

viewsIcon

953527

downloadIcon

14213

这是 WTL 库的停靠窗口实现。

Sample Image - WTLDockingWindows1.png

简介。

这是 WTL 库的停靠窗口实现。以下主题描述了如何使用停靠窗口类。

预构建设置。

  • 确保所有头文件都放置在适当的位置,并且编译器可以访问它。
  • DockImpl.cpp 添加到项目中。最好的方法可能是将 #include"DockImpl.cpp" 添加到 stdafx.cpp
  • 停靠窗口使用 STL,因此需要启用异常处理(/GX/EH 编译器选项),并在发布配置的预处理器定义列表中删除 _ATL_MIN_CRT。如果您使用标准的 HP STL,可以保留默认的项目设置,但我认为这并不是一个好主意。
  • 如果您使用 boost 库,请定义 USE_BOOST
  • 我使用了一些私有消息,范围从 WM_USERWM_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 的特性: COutlookLikeBoxedDockingWindowTraitsCOutlookLikeExBoxedDockingWindowTraitsCVC6LikeBoxedDockingWindowTraits
  • 要向之前的 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] — 其他标题栏类的基类
COutlookLikeExCaptionCOutlookLikeCaption [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] - 另一个简单的分隔条。
© . All rights reserved.