默认情况下,列表控件以标准网格方式排列所有项。 但是,支持另一种方法(工作区域)将列表项排列为矩形组。 有关实现工作区域的列表控件的图像,请参阅 Windows SDK 中使用 List-View 控件。
注释
仅当列表控件处于图标或小图标模式时,工作区域才可见。 但是,如果视图切换到报表或列表模式,则保留任何当前工作区域。
工作区域可用于显示空边框(在项的左侧、顶部和/或右侧),或导致水平滚动条在通常不存在时显示。 另一个常见用法是创建多个工作区域,项目可以移动或删除。 使用此方法,可以在具有不同含义的单个视图中创建区域。 然后,用户可以通过将项目放置在其他区域来对项目进行分类。 例如,文件系统的视图具有读取/写入文件的区域,以及只读文件的另一个区域。 如果将文件项移动到只读区域,它将自动变为只读。 将文件从只读区域移动到读/写区域会使文件读/写。
CListCtrl
提供了多个成员函数,用于在列表控件中创建和管理工作区域。
GetWorkAreas 和 SetWorkAreas 检索并设置对象(或RECT
结构)数组CRect
,用于存储列表控件当前实现的工作区域。 此外, GetNumberOfWorkAreas 检索列表控件的当前工作区域数(默认情况下为零)。
项目和工作区域
创建工作区时,位于工作区内的项将成为其成员。 同样,如果某个项移动到工作区,则它将成为其移动到的工作区的成员。 如果某个项不位于任何工作区中,它将自动成为第一个(索引 0)工作区的成员。 如果要创建项目并将其放置在特定工作区中,则需要创建该项目,然后使用对 SetItemPosition 的调用将其移动到所需的工作区域。 下面的第二个示例演示了此方法。
以下示例在列表控件中实现四个工作区域(rcWorkAreas
大小相等),每个工作区周围有 10 像素宽的边框。m_WorkAreaListCtrl
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);