SplitterCtrl - 一个用于将窗口分成多个部分的控件






4.89/5 (25投票s)
在本文中,您将学习一种用于将对话框、主窗口或子窗口分割成多个部分的控件。
引言
此控件用于将对话框、主窗口或子窗口分割成多个部分。您可以将窗口分配给每个部分,SplitterCtrl
将管理这些窗口。结果,我们将得到一个包含控件的矩阵。SplitterCtrl
继承自 CWnd
,并且是基于 MFC 的通用控件。通常,SplitterCtrl
类似于 CSplitterWnd
,但它更易于使用。例如,您可以创建一个复杂的矩阵。为此,需要在一个或多个单元格中放置 SplitterCtrl
,并进一步分割。
此外,可以将矩阵绑定到父窗口的四个角中的一个。您还可以使用鼠标动态或静态地拖动窗口之间的边界等等。
Using the Code
该控件包含以下类:
类 | 描述 |
| 包含所有基本功能,但不自行绘制。 |
| 此类允许分配控件各部分的尺寸。要使用,请从 |
| 此类允许绘制控件。您可以自行绘制窗口。为此,请从 |
要创建控件并向其中添加元素,请执行以下操作:
#include "SplitterCtrl.h"
SplitterCtrlEx<SplitterCtrlStyle1> m_Splitter;
CListCtrl m_List1, m_List2;
…
…
if( !m_Splitter.Create(this, WS_CHILD | WS_VISIBLE, CRect(0,0,200,200), ID_SplitterCtrl) )
return -1; // error.
// Create child controls.
if( !m_List1.Create(WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | LVS_REPORT, CRect(0,0,0,0),
&m_Splitter,ID_List1) ||
!m_List2.Create(WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | LVS_REPORT, CRect(0,0,0,0),
&m_Splitter,ID_List2) )
return -1; // error.
m_List1.InsertColumn(0,"00",LVCFMT_LEFT,100);
m_List2.InsertColumn(0,"01",LVCFMT_LEFT,100);
// Add child items in the m_Splitter.
m_Splitter.AddRow();
m_Splitter.AddColumn();
m_Splitter.AddColumn();
m_Splitter.SetWindow(0,0,m_List1.m_hWnd);
m_Splitter.SetWindow(0,1,m_List2.m_hWnd);
// Load state from registry.
if( !m_Splitter.LoadState(AfxGetApp(),"SplitterCtrl","SplitterState") )
{ m_Splitter.Update(); // !!!
m_Splitter.SetColumnsEqualWidth(); // error -> create default state.
}
m_Splitter.Update();
您可以像管理普通矩阵一样管理该控件,动态地插入和删除行和列(AddRow
/AddColumn
、InsertRow
/InsertColumn
、DeleteRow
/DeleteColumn
)。该控件允许分配尺寸(SetColumnWidthForStatic
/SetRowHeightForStatic
、SetColumnWidthForDynamic
/SetRowHeightForDynamic
),并使单元格的宽度和高度相等(SetColumnsEqualWidth
/SetRowsEqualHeight
)。该控件期望调用 Update
函数以显示由 InsertRow
、DeleteColumn
、SetRowHeightForStatic
、SetColumnWidthsForDynamic
等函数设置的结果。此外,您可以从注册表或其他来源保存和加载控件的状态(LoadState
/SaveState
)。要了解所有可能性,请查看 SplitterCtrl
类的开放接口。
祝您好运!
历史
- 2008年12月24日:初始版本
- 2021年3月16日:更新