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

CSSplitter: 一个能够保存/恢复其位置的分裂器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (54投票s)

2004年4月13日

GPL3

3分钟阅读

viewsIcon

143932

downloadIcon

7294

一个从 CStatic 派生的分裂器控件,用于对话框控件,不仅可以在受限的分裂器窗格内使用。

SSplitter

引言

CSSplitter 是一个从 CStatic 派生的类。 CSSplitter 为对话框、属性表和任何其他从 CWnd 派生的窗口提供分裂器功能(换句话说,调整大小功能)。

此类既可以与对话框资源中的控件一起使用,也可以与动态创建的控件一起使用。 此外,此分裂器控件在矩形区域内工作,其尺寸由类的用户定义。 您还可以为分裂器矩形区域分配边距,超出此边距,不允许移动分裂器。 要取消分裂,最终用户可以按 ESC 键。 使用 ESC 键对于基于 CFormView 的应用程序和其他应用程序(如基于 CView 的应用程序)很方便,但对于对话框则不可用。 CSSplitter 还使用 ShowWindow()MoveWindow() 方法隐藏/显示控件,而无需删除和重新创建。

有两种分裂模式。 默认选择第一种模式。 此模式在鼠标抬起事件上进行分裂。 如果设置了另一种模式,则在鼠标移动事件上进行分裂。 换句话说,分裂是连续的,就像在 MS Outlook Express 中看到的那样。 演示应用程序的工具栏按钮“M”在两种分裂模式之间切换以进行试验。

此外,由 CSSplitter 创建的分裂器将其位置保存到注册表中,然后在下一次创建包含控件的窗口时恢复它们。 分裂器窗格可以嵌套非常方便。

Using the Code

使用 CSSplitter 类,您可以按照以下步骤轻松地将分裂器功能添加到您的窗口中

  1. 将 "SSplitter.cpp" 和 "SSplitter.h" 添加到项目中。
  2. 在定义控件的头文件中包含 "SSplitter.h"。
  3. 为要创建的每个分裂器窗格添加一个成员变量
    CSSplitter m_MainSplitterPane;
  4. 在窗口初始化中,创建每个分裂器窗格的对象
    BOOL CTestDlg::OnInitDialog() 
    { 
    //...
        m_MainSplitterPane.Create(
            WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CLIPCHILDREN|SS_VERT,          
            this,            // the parent of the splitter pane
            &m_TreeCtrl,    // left pane
            &m_ListCtrl,    // right pane
            IDC_VERT_SPLITTER, // this ID is used for saving/restoring splitter
                        // position and therefore it must be unique 
                        // within your application
            rect,        // dimensions of the splitter pane
            90,            // left constraint for splitter position
            110         // right constraint for splitter position
        );
    //...

关于 CSSplitter 类的 Create() 方法的一些解释

BOOL Create(DWORD dwStyle, 
    CWnd* pParentWnd, 
    CWnd* pFPane, 
    CWnd* pSPane, 
    UINT nID, 
    const RECT& rc, 
    UINT nFConstr = 30, 
    UINT nSConstr = 30 
    ); 

参数

  • dwStyle - 指定分裂器窗格样式
  • pParentWnd - 分裂器窗格的父窗口指针
  • pFPane - 左窗格的指针(如果 dwStyle 包含 SS_VERT 样式),以及顶部窗格的指针(如果 dwStyle 包含 SS_HORIZ 样式)
  • pSPane - 右窗格的指针(如果 dwStyle 包含 SS_VERT 样式),以及底部窗格的指针(如果 dwStyle 包含 SS_HORIZ 样式)
  • nID - 资源 ID。 此 ID 用于保存/恢复分裂器位置,因此它在您的应用程序中必须是唯一的。
  • rc - 分裂器窗格的矩形
  • nFConstr - 左边距(如果 dwStyle 包含 SS_VERT 样式)和上边距(如果 dwStyle 包含 SS_HORIZ 样式)的像素数,超出此边距,不允许移动分裂器。 默认值为 30 像素。
  • nSConstr - 右边距(如果 dwStyle 包含 SS_VERT 样式)和下边距(如果 dwStyle 包含 SS_HORIZ 样式)的像素数,超出此边距,不允许移动分裂器。 默认值为 30 像素。

备注

使用 SS_VERT 样式用于垂直分裂器,使用 SS_HORIZ 样式用于水平分裂器。 使用 WS_CLIPCHILDRENOnEraseBkgnd 以防止调整大小时出现闪烁。 对于隐藏/显示窗格,可以使用 HideRightPane() / ShowRightPane()HideLeftPane() / ShowLeftPane()HideBottomPane() / ShowBottomPane() 方法。 方法 MakeVertSplitter()MakeHorizSplitter() 分别使分裂器垂直和水平。 SetSplitterPos(int nPos) 在其分裂器窗格内设置新的分裂器位置。 SetMouseMoveSplittingMode(BOOL bMouseMove) 用于设置分裂模式。 如果 bMouseMove=TRUE,则在鼠标移动事件上进行分裂。 如果 bMouseMove=FALSE(这是默认设置),则在鼠标抬起事件上进行分裂。 在演示应用程序中,通过单击标有“M”的工具栏按钮,您可以更改分裂模式。 然后,试验分裂器以查看分裂模式的实际效果。

© . All rights reserved.