实现列表控件中的工作区域

默认情况下,列表控件以标准网格方式排列所有项。 但是,支持另一种方法,即工作区域,它将列表项排列为矩形组。 有关实现工作区域的列表控件的图像,请参阅“使用 Windows SDK 中的列表视图控件”。

注意

仅当列表控件处于图标或小型图标模式时,工作区域才可见。 但是,如果视图切换到报表或列表模式,则保留任何当前工作区域。

工作区可用于显示空边框(在项的左侧、顶部和/或右侧),或者在通常没有水平滚动条时显示水平滚动条。 另一个常见的用法是创建多个可以移动或删除项的工作区域。 使用此方法,可以在单个视图中创建具有不同含义的区域。 然后,用户可以通过将项放置在不同的区域来对它们进行分类。 例如,文件系统的视图有一个用于读/写文件的区域和另一个用于只读文件的区域。 如果将文件项移动到只读区域,它将自动变为只读。 将文件从只读区域移动到读/写区域会使文件变为读/写。

CListCtrl 提供了几个成员函数,用于在列表控件中创建和管理工作区域。 GetWorkAreasSetWorkAreas 检索并设置 CRect 对象(或 RECT 结构)的数组,它们存储当前为你的列表控件实现的工作区域。 此外,GetNumberOfWorkAreas 检索列表控件的当前工作区域数(默认为零)。

项和工作区域

创建工作区域后,位于工作区域内的项将成为其成员。 同样,如果某个项被移动到某个工作区域,则它将成为其移动到的工作区域的成员。 如果某个项不在任何工作区域内,它会自动成为第一个(索引 0)工作区域的成员。 如果要创建某个项并将其放置在特定工作区域中,则需要创建该项,然后通过调用 SetItemPosition 将其移动到所需的工作区域。 下面的第二个示例演示了这种技术。

以下示例在列表控件 (m_WorkAreaListCtrl) 中实现了四个大小相等的工作区域 (rcWorkAreas),每个工作区域周围有 10 像素宽的边框。

CSize size;
size = m_WorkAreaListCtrl.ApproximateViewRect();
size.cx += 100;
size.cy += 100;

CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx / 2) - 5, (size.cy / 2) - 5);
rcWorkAreas[1].SetRect((size.cx / 2) + 5, 0, size.cx, (size.cy / 2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy / 2) + 5, (size.cx / 2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx / 2) + 5, (size.cy / 2) + 5, size.cx, size.cy);

//set work areas
m_WorkAreaListCtrl.SetWorkAreas(4, rcWorkAreas);

调用 ApproximateViewRect 是为了估算在一个区域中显示所有项所需的总面积。 然后将该估计值划分为四个区域,并用 5 像素宽的边框填充。

下一个示例将现有列表项分配给每个组 (rcWorkAreas) 并刷新控件视图 (m_WorkAreaListCtrl) 以完成效果。

// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
   rgptWork[i].x = rcWorkAreas[i].left + 10;
   rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (int i = 0; i < 20; i++)
{
   m_WorkAreaListCtrl.SetItemPosition(i, rgptWork[i % 4]);
}

// force the control to rearrange the shuffled items
m_WorkAreaListCtrl.Arrange(LVA_DEFAULT);

另请参阅

使用 CListCtrl
控件