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






4.89/5 (54投票s)
一个从 CStatic 派生的分裂器控件,用于对话框控件,不仅可以在受限的分裂器窗格内使用。
引言
CSSplitter
是一个从 CStatic
派生的类。 CSSplitter
为对话框、属性表和任何其他从 CWnd
派生的窗口提供分裂器功能(换句话说,调整大小功能)。
此类既可以与对话框资源中的控件一起使用,也可以与动态创建的控件一起使用。 此外,此分裂器控件在矩形区域内工作,其尺寸由类的用户定义。 您还可以为分裂器矩形区域分配边距,超出此边距,不允许移动分裂器。 要取消分裂,最终用户可以按 ESC 键。 使用 ESC 键对于基于 CFormView
的应用程序和其他应用程序(如基于 CView
的应用程序)很方便,但对于对话框则不可用。 CSSplitter
还使用 ShowWindow()
和 MoveWindow()
方法隐藏/显示控件,而无需删除和重新创建。
有两种分裂模式。 默认选择第一种模式。 此模式在鼠标抬起事件上进行分裂。 如果设置了另一种模式,则在鼠标移动事件上进行分裂。 换句话说,分裂是连续的,就像在 MS Outlook Express 中看到的那样。 演示应用程序的工具栏按钮“M
”在两种分裂模式之间切换以进行试验。
此外,由 CSSplitter
创建的分裂器将其位置保存到注册表中,然后在下一次创建包含控件的窗口时恢复它们。 分裂器窗格可以嵌套非常方便。
Using the Code
使用 CSSplitter
类,您可以按照以下步骤轻松地将分裂器功能添加到您的窗口中
- 将 "SSplitter.cpp" 和 "SSplitter.h" 添加到项目中。
- 在定义控件的头文件中包含 "SSplitter.h"。
- 为要创建的每个分裂器窗格添加一个成员变量
CSSplitter m_MainSplitterPane;
- 在窗口初始化中,创建每个分裂器窗格的对象
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_CLIPCHILDREN
和 OnEraseBkgnd
以防止调整大小时出现闪烁。 对于隐藏/显示窗格,可以使用 HideRightPane()
/ ShowRightPane()
、HideLeftPane()
/ ShowLeftPane()
、HideBottomPane()
/ ShowBottomPane()
方法。 方法 MakeVertSplitter()
和 MakeHorizSplitter()
分别使分裂器垂直和水平。 SetSplitterPos(int nPos)
在其分裂器窗格内设置新的分裂器位置。 SetMouseMoveSplittingMode(BOOL bMouseMove)
用于设置分裂模式。 如果 bMouseMove=TRUE
,则在鼠标移动事件上进行分裂。 如果 bMouseMove=FALSE
(这是默认设置),则在鼠标抬起事件上进行分裂。 在演示应用程序中,通过单击标有“M
”的工具栏按钮,您可以更改分裂模式。 然后,试验分裂器以查看分裂模式的实际效果。