如何使用列表视图工作区域

本主题演示如何使用列表视图工作区。 工作区是一个矩形虚拟区域,可用于在列表视图控件中排列项目。 工作区不是窗口,不能有可见边框。 默认情况下,列表视图控件没有工作区。 通过创建工作区,可以在项目的左侧、顶部或右侧创建一个空边框,或者在通常没有水平滚动条的情况下显示水平滚动条。

需要了解的事项

技术

先决条件

  • 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;
}

列表视图控件参考

关于列表视图控件

使用列表视图控件