如何使用列表视图工作区域
本主题演示如何使用列表视图工作区。 工作区是一个矩形虚拟区域,可用于在列表视图控件中排列项目。 工作区不是窗口,不能有可见边框。 默认情况下,列表视图控件没有工作区。 通过创建工作区,可以在项目的左侧、顶部或右侧创建一个空边框,或者在通常没有水平滚动条的情况下显示水平滚动条。
需要了解的事项
技术
先决条件
- C/C++
- Windows 用户界面编程
说明
创建工作区
以下 C++ 代码示例演示了如何创建一个在顶部、左侧和右侧都有 25 像素空边框的工作区。
void SetWorkAreas1(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
GetClientRect(hWndListView, &rcClient);
rcClient.left += EMPTY_SPACE;
rcClient.top += EMPTY_SPACE;
rcClient.right -= (EMPTY_SPACE * 2);
SendMessage(hWndListView, LVM_SETWORKAREAS, 1, (LPARAM)&rcClient);
return;
}
创建多个工作区域
以下 C++ 代码示例演示了如何在一个控件中创建两个工作区。 每个工作区约占客户区的一半,并且周围留有一个 25 像素的空边框。
void SetWorkAreas2(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
RECT rcWork[2];
GetClientRect(hWndListView, &rcClient);
rcWork[0].left = rcClient.left + EMPTY_SPACE;
rcWork[0].top = rcClient.top + EMPTY_SPACE;
rcWork[0].right = (rcClient.right/2) - EMPTY_SPACE;
rcWork[0].bottom = rcClient.bottom;
rcWork[1].left = (rcClient.right/2) + EMPTY_SPACE;
rcWork[1].top = rcClient.top + EMPTY_SPACE;
rcWork[1].right = rcClient.right - EMPTY_SPACE;
rcWork[1].bottom = rcClient.bottom;
SendMessage(hWndListView, LVM_SETWORKAREAS, 2, (LPARAM)rcWork);
return;
}
确定项目所属的工作区
确定项目属于哪个工作区的方法之一是执行以下操作:
- 检索列表视图控件中所有工作区的坐标列表。
- 检索项目的坐标。
- 确定项目坐标是否位于其中一个工作区的坐标范围内。
以下 C++ 代码示例中的应用程序定义函数会返回项目所属工作区的索引。 如果该函数失败,则返回 -1。 如果函数成功,但该项目不在任何工作区内,则函数会返回 0,因为所有不在工作区内的项目都会自动成为工作区 0 的成员。
int GetItemWorkingArea(HWND hWndListView, int iItem)
{
UINT uWorkAreas = 0;
int nReturn = -1;
LPRECT pRects;
POINT pt;
if(!ListView_GetItemPosition(hWndListView, iItem, &pt))
return nReturn;
ListView_GetNumberOfWorkAreas(hWndListView, &uWorkAreas);
if(uWorkAreas)
{
pRects = (LPRECT)GlobalAlloc(GPTR, sizeof(RECT) * uWorkAreas);
if(pRects)
{
UINT i;
nReturn = 0;
ListView_GetWorkAreas(hWndListView, uWorkAreas, pRects);
for(i = 0; i < uWorkAreas; i++)
{
if(PtInRect((pRects + i), pt))
{
nReturn = i;
break;
}
}
GlobalFree((HGLOBAL)pRects);
}
}
return nReturn;
}
相关主题