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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (25投票s)

2008 年 12 月 24 日

公共领域

2分钟阅读

viewsIcon

70323

downloadIcon

6919

在本文中,您将学习一种用于将对话框、主窗口或子窗口分割成多个部分的控件。

引言

此控件用于将对话框、主窗口或子窗口分割成多个部分。您可以将窗口分配给每个部分,SplitterCtrl 将管理这些窗口。结果,我们将得到一个包含控件的矩阵。SplitterCtrl 继承自 CWnd,并且是基于 MFC 的通用控件。通常,SplitterCtrl 类似于 CSplitterWnd,但它更易于使用。例如,您可以创建一个复杂的矩阵。为此,需要在一个或多个单元格中放置 SplitterCtrl,并进一步分割。

此外,可以将矩阵绑定到父窗口的四个角中的一个。您还可以使用鼠标动态或静态地拖动窗口之间的边界等等。

Using the Code

该控件包含以下类:

描述

SplitterCtrl

包含所有基本功能,但不自行绘制。

SplitterCtrl::IRecalc

此类允许分配控件各部分的尺寸。要使用,请从 SplitterCtrl::IRecalc 继承并实现其函数。此外,在您的类的构造函数中,需要使用 SplitterCtrl::IRecalc 对象的指针调用 SplitterCtrl::SetRecalcManager 函数。

SplitterCtrl::Draw

此类允许绘制控件。您可以自行绘制窗口。为此,请从 SplitterCtrl::Draw 继承并实现其函数。此外,在您的类的构造函数中,需要使用 SplitterCtrl::Draw 对象的指针调用 SplitterCtrl::SetDrawManager 函数。

要创建控件并向其中添加元素,请执行以下操作:

#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/AddColumnInsertRow/InsertColumnDeleteRow/DeleteColumn)。该控件允许分配尺寸(SetColumnWidthForStatic/SetRowHeightForStaticSetColumnWidthForDynamic/SetRowHeightForDynamic),并使单元格的宽度和高度相等(SetColumnsEqualWidth/SetRowsEqualHeight)。该控件期望调用 Update 函数以显示由 InsertRowDeleteColumnSetRowHeightForStaticSetColumnWidthsForDynamic 等函数设置的结果。此外,您可以从注册表或其他来源保存和加载控件的状态(LoadState/SaveState)。要了解所有可能性,请查看 SplitterCtrl 类的开放接口。

祝您好运!

历史

  • 2008年12月24日:初始版本
  • 2021年3月16日:更新
© . All rights reserved.