关于List-View控件

请参阅 虚拟列表视图控件示例

列表视图控件是显示项集合的窗口。 列表视图控件提供了多种排列和显示项的方法,并且比简单的 列表框更灵活。 例如,有关每个项的其他信息可以显示在图标和标签右侧的列中。

List-View样式和视图

列表视图控件可以在五个不同的视图中显示项。 控件的窗口样式指定默认视图。 其他窗口样式指定项和特定于控件的功能的对齐方式。 下表描述了这些视图。

视图名称 描述
图标视图 LVS_ICON 窗口样式指定,或者通过使用 LVM_SETVIEW 消息传递 LV_VIEW_ICON 来指定。 每个项都显示为一个最大化图标,在它的下面有一个标签。 用户可以将项拖动到列表视图窗口中的任何位置。
小图标视图 LVS_SMALLICON 窗口样式指定,或使用 LVM_SETVIEW 传递 LV_VIEW_SMALLICON。 每个项都显示为一个小图标,其右侧有标签。 用户可以将项拖动到任何位置。
列表视图 LVS_LIST 窗口样式指定,或使用 LVM_SETVIEW 传递 LV_VIEW_LIST。 各项显示为一个小图标,小图标右侧有一个标签。 项按列排列,用户无法将其拖动到任意位置。
报表 (详细信息) 视图 LVS_REPORT 窗口样式指定,或使用 LVM_SETVIEW 传递 LV_VIEW_DETAILS。 每个项都显示在自己的行上,信息按列排列。 最左侧的列始终保持对齐状态,并包含小图标和标签。 后续列包含应用程序指定的子项。 每列都有一个标题,除非还指定 LVS_NOCOLUMNHEADER 窗口样式。
图块视图 版本 6 及更高版本。 使用 LVM_SETVIEW 传递 LV_VIEW_TILE来指定。 每个项显示为一个全尺寸图标,旁边有一个或多个行的标签。

 

以下屏幕截图使用视图显示有关七只宠物的不同信息量。 这些视图演示了信息在 Windows Vista 上的显示方式。 控件的视觉样式已使用 SetWindowTheme 设置为“资源管理器”主题。

以下屏幕截图显示了详细信息视图。

显示五列和七行信息的屏幕截图

以下屏幕截图显示了图标视图。

仅显示每个宠物的名称和一个指示物种的图标的屏幕截图

以下屏幕截图显示了列表视图。

显示每个宠物名称、品种和价格文本旁边的大图标的屏幕截图

以下屏幕截图显示了磁贴视图。

磁贴视图。

可以在创建列表视图控件后更改视图类型。 若要检索和更改窗口样式,请使用 GetWindowLongSetWindowLong 函数。 若要确定当前视图的窗口样式,请使用 LVS_TYPEMASK 值。

可以通过指定LVS_ALIGNTOP (默认 ) LVS_ALIGNLEFT 窗口样式来控制在图标或小图标视图中项的排列方式。

可以在创建列表视图控件后更改对齐方式。 若要确定当前对齐方式,请使用 LVS_ALIGNMASK 值。

其他窗口样式提供了其他选项,例如用户是否可以编辑标签或一次选择多个项。 有关完整列表,请参阅 列表视图窗口样式

扩展List-View样式

扩展列表视图控件样式提供复选框、平面滚动条、网格线和热跟踪等选项。 有关完整列表,请参阅 扩展List-View样式。 访问扩展列表视图样式的方式与标准窗口样式不同。 请勿使用 GetWindowLongSetWindowLong 函数进行扩展样式更改。

有两条消息设置和检索扩展样式信息, LVM_SETEXTENDEDLISTVIEWSTYLELVM_GETEXTENDEDLISTVIEWSTYLE。 可以使用以下相应的宏,而不是显式发送消息: ListView_SetExtendedListViewStyleListView_SetExtendedListViewStyleExListView_GetExtendedListViewStyle

虚拟List-View样式

虚拟列表视图是具有 LVS_OWNERDATA 样式的列表视图控件。 此样式使控件能够处理数百万个项目,因为所有者需要承担管理项数据的负担。 这样,就可以将虚拟列表视图控件与大型信息数据库结合使用,其中已有特定的数据访问方法。

虚拟列表视图控件本身维护的项信息非常少。 除了项目选择和焦点信息,控件的所有者必须管理所有项信息。 其他进程通过使用 LVN_GETDISPINFO 通知代码向所有者请求项目信息。

由于这种类型的列表控件适用于大型数据集,因此建议缓存请求的项数据以提高检索性能。 列表视图提供缓存提示机制来帮助优化缓存。 该提示以 LVN_ODCACHEHINT 通知代码的形式实现。

创建虚拟List-View控件

使用 CreateWindow 或CreateWindowEx 函数创建虚拟列表视图控件,并将 LVS_OWNERDATA 窗口样式指定为 dwStyle 函数参数的一部分。 不支持动态切换LVS_OWNERDATA样式。

可以将LVS_OWNERDATA样式与除LVS_SORTASCENDINGLVS_SORTDESCENDING样式以外的大多数其他窗口样式结合使用。 所有虚拟列表视图控件默认为 LVS_AUTOARRANGE 样式。

若要使项目显示在列表中,必须先显式发送 或使用 ListView_SetItemCountEx 宏发送 LVM_SETITEMCOUNT 消息。

LVS_OWNERDATA样式不支持以下消息:LVM_ENABLEGROUPVIEWLVM_GETITEMTEXTLVM_SETTILEINFOLVM_MAPIDTOINDEX

兼容性问题

所有四种列表视图样式(图标、小图标、列表和报表视图)都支持 LVS_OWNERDATA 样式。 具有 LVS_OWNERDATA 样式的列表视图控件不存储任何特定于项的信息。 因此,可应用于项的唯一有效项状态标志是 LVIS_SELECTEDLVIS_FOCUSED。 不存储其他状态信息。 具体而言,列表视图控件不维护每个项的状态或覆盖图像。 但是,可以通过向应用程序发送 LVM_SETCALLBACKMASK 消息来让列表视图控件查询这些图像。

完全支持大多数列表视图控件消息和关联的宏。 但是,使用 LVS_OWNERDATA 样式时,某些消息存在限制或不受支持。 下表汇总了受影响的消息。

Message 限制
LVM_ARRANGE 不支持 LVA_SNAPTOGRID 样式。
LVM_DELETEALLITEMS 将项计数设置为零并清除所有内部选择变量,但实际上不会删除任何项。 它发出通知回调。
LVM_DELETEITEM 仅支持选择完整性,实际上不会删除项。
LVM_GETITEMSTATE 仅返回焦点和选择状态 (即列表视图控件) 存储的状态。
LVM_GETNEXTITEM 不支持列表视图搜索条件 LVNI_CUTLVNI_HIDDENLVNI_DROPHILITED。 支持所有其他条件。
LVM_GETWORKAREAS 不支持。
LVM_INSERTITEM 仅支持选择完整性。
LVM_SETITEM 不支持。 若要设置项状态,请使用 ListView_SetItemState 消息。
LVM_SETITEMCOUNT 设置列表中当前项的数目。 如果列表视图控件发送一个通知,该通知请求数据的任何项目(最大设置为最大集),则所有者必须准备好提供该数据。 消息参数支持虚拟列表视图控件。
LVM_SETITEMPOSITION 不支持。
LVM_SETITEMSTATE 仅允许更改项目的选择和焦点状态。
LVM_SETITEMTEXT 不支持。 应用程序负责维护项文本。
LVM_SETWORKAREAS 不支持。
LVM_SORTITEMS 不支持。 应用程序负责按所需顺序显示项。

 

处理虚拟List-View控制通知代码

具有 LVS_OWNERDATA 样式的列表视图控件发送与其他列表视图控件相同的通知代码,以及另外两个通知代码: LVN_ODCACHEHINTLVN_ODFINDITEM。 下面是具有 LVS_OWNERDATA 样式的列表视图控件发送的最常见通知。

通知 说明
LVN_GETDISPINFO 虚拟列表视图控件本身维护的项信息非常少。 因此,它通常会发送 LVN_GETDISPINFO 通知代码来请求项信息。 此消息的处理方式与标准列表控件中的回调项处理方式大致相同。 由于 控件支持的项数可能非常大,因此缓存项数据可以提高性能。 处理LVN_GETDISPINFO时,控件的所有者首先尝试从缓存 (提供请求的项信息,有关详细信息,请参阅 缓存管理) 。 如果未缓存请求的项,则所有者必须准备好通过其他方式提供信息。
LVN_ODCACHEHINT 虚拟列表视图发送 LVN_ODCACHEHINT 通知代码,以帮助优化缓存。 通知代码为建议缓存的一系列项提供非独占索引值。 收到通知代码后,所有者必须准备好加载包含所请求范围的项信息的缓存,以便在发送 LVN_GETDISPINFO 消息时信息随时可用。
LVN_ODFINDITEM 控件 需要所有者来查找特定回调项时,虚拟列表视图控件会发送LVN_ODFINDITEM通知代码。 当列表视图控件接收快速密钥访问或收到 LVM_FINDITEM 消息时,将发送通知代码。 搜索信息以 LVFINDINFO 结构的形式发送,该结构是 NMLVFINDITEM 结构的成员。 所有者必须准备好搜索与列表视图控件提供的信息匹配的项。 如果成功,所有者返回项的索引;如果找不到匹配项,则返回 -1。

 

缓存管理

具有 LVS_OWNERDATA 样式的列表视图控件会生成大量 LVN_GETDISPINFO 通知代码,并且为了帮助优化缓存, LVN_ODCACHEHINT 消息。 LVN_ODCACHEHINT消息提供有关要包含在缓存中的建议项的信息。 这些消息作为 WM_NOTIFY 消息发送, lParam 值充当 NMLVCACHEHINT 结构的地址。

NMLVCACHEHINT 结构包括两个整数成员 iFromiTo,它们表示最可能需要的项范围的非独占终结点。 所有者必须准备好加载缓存,其中包含建议范围内每个项的项信息。

列表控件通常需要第一个项的项信息, (偏移 0) 。 LVN_ODCACHEHINT通知代码可能并不总是包含项 0,但必须始终包含在缓存中。

经常访问列表中的最后一项。 因此,所有者可能希望保留第二个缓存,其中包含列表末尾的项。 可以根据结束缓存检查 LVN_ODCACHEHINT 请求的范围,使其自动可用,而不是每次都重新加载相同的结束范围。

List-View工作区

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

创建工作区后,位于工作区内的项将成为工作区的成员。 同样,如果将某个项移到工作区中,则该项目将成为该工作区的成员。 如果某个项不在任何工作区域内,它会自动成为第一个(索引 0)工作区域的成员。 若要将新项目放置在特定工作区中,必须先创建该项目,然后使用 LVM_SETITEMPOSITIONLVM_SETITEMPOSITION32 消息将其移动到所需的工作区。

下图是列表视图控件的示例,该控件包含四个工作区域,每个工作区位于工作区的不同象限中。

在工作区的每个象限中具有一个工作区的列表视图控件的屏幕截图

多个工作区域可用于在一个视图中创建不同的区域。 可以在单个视图中创建具有不同含义的区域。 例如,文件系统的视图可能有一个区域用于读取/写入文件,另一个区域用于只读文件。 用户可以通过将项目放置在不同的工作区域中来对项目进行分类。 如果将文件移动到只读区域,它将自动变为只读。

多个工作区域可以相交,但交集内的任何项都将成为索引较低的区域的成员:因此,最好避免这种情况。 对多个工作区进行排序时,将比较同一工作区中的其他项目对项目进行排序。

可以使用 LVM_GETNUMBEROFWORKAREAS 消息检索工作区域的数量。 工作区域随 LVM_SETWORKAREAS 消息更改,并且可以使用 LVM_GETWORKAREAS 消息进行检索。 这两条消息都以 RECT 结构数组的地址作为 lParam ,将 RECT 结构的数目作为 wParam。 这些结构的 成员和 顶部 成员 (工作区域的原点) 指定左上角的坐标, 右侧 成员和 底部 成员指定工作区的右下角。 所有坐标都在列表视图的客户端坐标中。 允许的最大工作区域数由 LV_MAX_WORKAREAS 值定义。

更改工作区对具有 LVS_LIST 视图或 LVS_REPORT 视图的列表视图控件没有影响,但在视图类型更改时,将保留工作区域。 使用 LVS_ICONLVS_SMALLICON 视图,可以修改工作区以更改项的显示方式。 使工作区的宽度 (向右-左) 大于控件的客户端宽度会导致项目以该宽度包装,并显示水平滚动条。 使工作区的宽度比控件工作区的宽度更窄,会导致项目包装在工作区中,而不是工作区中。 将 左侧顶部 成员设置为正值会导致从工作区开始显示项目,从而在控件边缘和项之间创建一个空白区域。 通过将工作区的宽度小于控件的客户端宽度,还可以在控件的右边缘和项之间创建一个空白空间。

List-View图像列表

默认情况下,列表视图控件不显示项图像。 若要显示项图像,必须创建图像列表并将其与 控件相关联。 列表视图控件可以有三个图像列表:

  • 包含控件在图标视图中时显示的全尺寸图标的图像列表。
  • 包含控件处于小图标视图、列表视图或报表视图时显示的小图标的图像列表。
  • 包含状态图像的图像列表,这些图像显示在全尺寸图标或小图标的左侧。 可以使用状态图像(如选中和清除的复选框)来指示应用程序定义的项状态。 状态图像显示在图标视图、小图标视图、列表视图和报表视图中。

全尺寸和小型图标图像列表还可以包含 覆盖图像,这些图像设计为在项图标上以透明方式绘制。

若要在列表视图控件中使用覆盖图像,请执行以下操作:

  1. 调用 ImageList_SetOverlayImage 函数,将覆盖图像索引分配给全尺寸和小型图标图像列表中的图像。 覆盖图像由基于 1 的索引标识。
  2. 调用 ListView_InsertItemListView_SetItem 宏时,可以将覆盖图像索引与项相关联。 使用 INDEXTOOVERLAYMASK 宏在项的 LVITEM 结构的状态成员中指定覆盖图像索引。 还必须在 stateMask 成员中设置LVIS_OVERLAYMASK位。

如果指定了状态图像列表,列表视图控件会为每个状态图像的图标左侧保留空间。

若要将状态图像与项相关联,请使用 INDEXTOSTATEIMAGEMASK 宏在 LVITEM 结构的状态成员中指定状态图像索引。 索引标识控件的状态图像列表中的图像。 尽管图像列表索引从零开始,但控件使用从 1 开始的索引来标识状态图像。 状态图像索引为零表示项没有状态图像。

默认情况下,当销毁列表视图控件时,它会销毁分配给它的图像列表。 但是,如果列表视图控件具有 LVS_SHAREIMAGELISTS 窗口样式,则应用程序负责在图像列表不再使用时销毁这些列表。 如果将相同的图像列表分配给多个列表视图控件,则应指定此样式;否则,多个控件可能会尝试销毁同一个图像列表。

List-View项和子项

列表视图控件中的每个项都有一个图标、一个标签、一个当前状态和一个应用程序定义的值。 通过使用列表视图消息,可以添加、修改和删除项,以及检索有关项的信息。

每个项可以有一个或多个 子项。 子项是一个字符串,在报表视图中显示在与项的图标和标签分开的列中。 若要指定子项的文本,请使用 LVM_SETITEMTEXTLVM_SETITEM 消息。 列表视图控件中的所有项具有相同数量的子项。 子项数由列表视图控件中的列数决定。 将列添加到列表视图控件时,可以指定其关联的子项索引。

LVITEM 结构定义列表视图项或子项。 iItem 成员是从零开始的项索引。 iSubItem 成员是子项的从 1 开始的索引,如果结构包含有关项的信息,则为零。 其他成员指定项的文本、图标、状态和项数据。 项数据 是应用程序定义的值,与列表视图项相关联。

若要将项添加到列表视图控件,请使用 LVM_INSERTITEM 消息,并指定 LVITEM 结构的地址。 在添加多个项之前,可以向控件发送 LVM_SETITEMCOUNT 消息,指定控件最终将包含的项目数。 此消息使列表视图控件只能重新分配其内部数据结构一次,而不是在每次添加项时重新分配。 可以使用 LVM_GETITEMCOUNT 消息来确定列表视图控件中的项数。 如果要向列表视图控件添加大量项,可以在添加项之前禁用重绘,然后在添加项后启用重绘,从而加快该过程。 使用 WM_SETREDRAW 消息启用和禁用重绘。

若要更改列表视图项的属性,请使用 LVM_SETITEM 消息,并指定 LVITEM 结构的地址。 此结构的 mask 成员指定要更改的项属性。 例如,若要仅更改项或子项的文本,请使用 LVM_SETITEMTEXT 消息。

若要检索有关列表视图项的信息,请使用 LVM_GETITEM 消息,并指定要填充的 LVITEM 结构的地址。 此结构的 mask 成员指定要检索的项属性。 若要仅检索项或子项的文本,请使用 LVM_GETITEMTEXT 消息。

若要删除列表视图项,请使用 LVM_DELETEITEM 消息。 可以使用 LVM_DELETEALLITEMS 消息删除列表视图控件中的所有项。

List-View项状态

项的状态是一个值,该值指定项的可用性、指示用户操作或以其他方式反映项的状态。 列表视图控件会更改某些状态位,例如当用户选择项时。 应用程序可能会更改其他状态位以禁用或隐藏项,或者指定覆盖图像或状态图像。 有关覆盖图像和状态图像的详细信息,请参阅 列表视图图像列表

项的状态由 LVITEM 结构的状态成员指定。 指定或更改项的状态时, stateMask 成员指定需要更改的状态位。 可以使用 LVM_SETITEMSTATE 消息更改项的状态。 可以在创建项时或使用 LVM_SETITEM 消息更改其属性时指定项的状态。 若要确定项目的当前状态,请使用 LVM_GETITEMSTATELVM_GETITEM 消息。

若要设置项的覆盖图像,LVITEM 结构的 stateMask 成员必须包含LVIS_OVERLAYMASK值,并且状态成员必须包含通过使用 INDEXTOOVERLAYMASK 宏向左移动 8 位的覆盖图像的从 1 开始的索引。 索引可以为零,以指定无覆盖图像。

若要设置项的状态图像,LVITEM 结构的 stateMask 成员必须包含LVIS_STATEIMAGEMASK值,并且状态成员必须包含通过使用 INDEXTOSTATEIMAGEMASK 宏向左移动 12 位的状态图像的从 1 开始的索引。 索引可以为零以指定无状态图像。

回调项和回调掩码

对于每个项,列表视图控件通常存储标签文本、项图标的图像列表索引以及项状态的一组位标志。 可以定义回调项或更改控件的回调掩码,以指示应用程序(而不是控件)存储部分或全部此信息。 如果应用程序存储了部分此信息,则可能需要使用回调。

列表视图控件中的 回调项 是应用程序存储文本索引或图标索引或同时存储两者的项。 在发送 LVM_INSERTITEM 消息以将项添加到列表视图控件时,可以定义回调项。 如果应用程序存储项或子项的文本,请将项的 LVITEM 结构的 pszText 成员设置为LPSTR_TEXTCALLBACK。 如果应用程序存储项的图标索引,请将项的 LVITEM 结构的 iImage 成员设置为I_IMAGECALLBACK

列表视图控件的 回调掩码 是一组位标志,用于指定应用程序(而不是控件)存储当前数据的项状态。 回调掩码适用于控件的所有项,而回调项指示符则不同,它适用于特定项。 默认情况下,回调掩码为零,这意味着列表视图控件存储所有项状态信息。 创建列表视图控件并初始化其项后,可以发送 LVM_SETCALLBACKMASK 消息以更改回调掩码。 若要检索当前回调掩码,请发送 LVM_GETCALLBACKMASK 消息。

当列表视图控件必须显示或排序应用程序存储回调信息的列表视图项时,控件会将 LVN_GETDISPINFO 通知代码发送到控件的父窗口。 此消息指定包含所需信息类型并标识要检索的项或子项的 NMLVDISPINFO 结构。 父窗口必须处理LVN_GETDISPINFO以提供请求的数据。

如果列表视图控件检测到项的回调信息发生更改,例如文本、图标或状态信息的更改,则控件会发送 LVN_SETDISPINFO 通知代码来通知你更改。

如果更改回调项的属性或状态位,请使用 LVM_UPDATE 消息强制控件重新绘制该项。 如果控件具有 LVS_AUTOARRANGE 样式,则此消息还会导致控件排列其项。 可以使用 LVM_REDRAWITEMS 消息通过使列表视图控件工作区的相应部分失效来重绘项目范围。

通过有效地使用回调项和回调掩码,可以确保每个项属性只保留在一个位置。 这样做可以简化应用程序,但保存的唯一空间是存储项标签和子项文本所需的内存。

List-View项位置

每个列表视图项都有一个位置和大小,你可以使用消息检索和设置这些位置和大小。 还可以确定哪个项(如果有)位于指定位置。 列表视图项的位置在 视图坐标中指定,这些坐标是滚动位置的客户端坐标偏移量。

若要检索和设置项的位置,请使用 LVM_GETITEMPOSITIONLVM_SETITEMPOSITION 消息。 LVM_GETITEMPOSITION 适用于所有视图,但 LVM_SETITEMPOSITION 仅适用于图标视图和小图标视图。

可以使用 LVM_HITTEST 消息确定位于特定位置的项(如果有)。

若要检索列表项的边框或仅检索其图标或标签的边框,请使用 LVM_GETITEMRECT 消息。

排列、排序和查找项

可以使用列表视图消息对项目进行排列和排序,以及根据项的属性或位置查找项。 排列重新定位项目以在网格上对齐,但项的索引不会更改。 排序会更改项 (的顺序及其相应的索引) ,然后相应地重新定位它们。 只能在图标和小图标视图中排列项目,但可以在任何视图中对项目进行排序。 若要查找项,请发送指定项位置或属性的列表视图消息。

若要排列项目,请使用 LVM_ARRANGE 消息。 通过指定 LVS_AUTOARRANGE 窗口样式,可以确保项目始终保持排列。

若要对项目进行排序,请使用 LVM_SORTITEMS 消息。 使用此消息进行排序时,指定应用程序定义的回调函数,列表视图控件调用该函数来比较任意两个项的相对顺序。 控件将与两个项中的每个项关联的项数据传递给比较函数。 项数据是在项的 LVITEM 结构的 lParam 成员中插入列表时指定的值。 通过指定适当的项数据并提供适当的比较函数,可以按标签、任何子项或任何其他属性对项进行排序。 请注意,对项进行排序不会对相应的子项重新排序。 当项目重新排序时,其相应的子项将随其一起携带:也就是说,整行保留在一起。 若要将列彼此分开排序,将子项与其项分离,必须在使用 LVM_SETITEM 排序后重新生成列。

可以通过指定 LVS_SORTASCENDINGLVS_SORTDESCENDING 窗口样式来确保列表视图控件始终排序。 具有这些样式的控件使用项的标签文本按升序或降序对其进行排序。 使用这些窗口样式时,无法提供比较函数。 如果列表视图控件具有上述任一样式,则如果尝试插入LPSTR_TEXTCALLBACK作为其 LVITEM 结构的 pszText 成员的项,LVM_INSERTITEM消息将失败。

可以使用 LVM_FINDITEM 消息查找具有特定属性的列表视图项。 可以使用 LVM_GETNEXTITEM消息查找 处于指定状态且与给定项具有指定关系的列表视图项。 例如,可以检索指定项右侧的下一个选定项。

List-View列

列控制项及其子项在报表视图中的显示方式。 每列都有标题和宽度,并与特定的子项相关联;子项零是项的图标和标签。 列的属性由 LVCOLUMN 结构定义。

若要向列表视图控件添加列,请使用 LVM_INSERTCOLUMN 消息。 若要删除列,请使用 LVM_DELETECOLUMN 消息。

注意

仅在ComCtl32.dll版本 6 及更高版本中,才支持删除列表视图控件的零列。 版本 5 还支持删除列 0,但仅在使用 CCM_SETVERSION 将版本设置为 5 或更高版本之后。 版本 5 之前的版本不支持删除列 0。

 

可以使用LVM_GETCOLUMN和LVM_SETCOLUMN消息来检索和更改现有列的属性。 若要检索或更改列的宽度,请使用 LVM_GETCOLUMNWIDTHLVM_SETCOLUMNWIDTH 消息。

除非指定 LVS_NOCOLUMNHEADER 窗口样式,否则列标题将显示在报表视图中。 用户可以单击列标题,从而将 LVN_COLUMNCLICK 通知代码发送到父窗口。 通常,发生此单击时,父窗口按指定的列对列表视图控件进行排序。 用户还可以在标题之间拖动列参考线以调整列的大小。

列表视图控件可以在列标题旁边显示图像。 若要实现此功能,请指定LVCF_IMAGE值,并将图像的索引分配给 LVCOLUMN 结构中的 iImage 成员。

列表视图控件可以设置列的显示顺序。 若要实现此功能,请指定LVCF_ORDER值,并将列顺序分配给 LVCOLUMN 结构中的 iOrder 成员。 列顺序从零开始,按从左到右的顺序排列。 例如,零表示最左侧的列。

List-View滚动位置

除非指定 了LVS_NOSCROLL 窗口样式,否则可以滚动列表视图控件以显示超出控件工作区可容纳的项数。 可以检索列表视图控件的滚动位置和相关信息,按指定数量滚动列表视图控件,或滚动列表视图控件,以便指定的列表项可见。

在图标视图或小图标视图中,当前滚动位置由 视图原点定义。 视图原点是相对于列表视图控件的可见区域的坐标集,对应于视图坐标 (0、0) 。 若要检索当前视图源,请使用 LVM_GETORIGIN 消息。 此消息应仅在图标或小图标视图中使用;它在列表或报表视图中返回错误。

在列表或报表视图中,当前滚动位置由 顶部索引定义。 顶部索引是列表视图控件中第一个可见项的索引。 若要检索当前排名靠前的索引,请使用 LVM_GETTOPINDEX 消息。 此消息仅在列表或报表视图中返回有效结果;它在图标或小图标视图中返回零。

可以使用 LVM_GETVIEWRECT 消息检索列表视图控件中所有项的边框,相对于控件的可见区域。

LVM_GETCOUNTPERPAGE消息返回列表视图控件的一页中适合的项数。 此消息仅在列表和报表视图中返回有效结果;它返回项总数。

若要按特定数量滚动列表视图控件,请使用 LVM_SCROLL 消息。 使用 LVM_ENSUREVISIBLE 消息,可以滚动列表视图控件(如有必要),以确保指定的项可见。

List-View标签编辑

具有 LVS_EDITLABELS 窗口样式的列表视图控件使用户能够就地编辑项目标签。 用户通过单击具有焦点的项的标签开始编辑。 或者,应用程序可以使用 LVM_EDITLABEL 消息自动开始编辑。 列表视图控件在编辑开始以及取消或完成编辑时通知父窗口。 编辑完成后,父窗口负责更新项的标签(如果适用)。

标签编辑开始时,将创建、定位和初始化 编辑控件 。 在显示之前,列表视图控件会向其父窗口发送 LVN_BEGINLABELEDIT 通知代码。 如果需要修改标签编辑过程,可以为此通知实现处理程序。

LVN_BEGINLABELEDIT通知处理程序的一个用途是控制用户可以编辑的标签。 若要阻止标签编辑,请返回非零值。 若要自定义标签编辑,请让通知处理程序通过将 LVM_GETEDITCONTROL 消息发送到列表视图控件来检索编辑控件的句柄。 拥有该句柄后,可以通过发送常用EM_XXX消息来自定义编辑控件。 例如,若要限制用户可以输入的文本量,请向编辑控件发送 EM_LIMITTEXT 消息。 可以使用 SetWindowText 更改编辑控件的默认文本。 甚至可以对编辑控件进行子类化以截获和丢弃无效字符。

取消或完成标签编辑后,列表视图控件会向其父窗口发送 LVN_ENDLABELEDIT 通知代码。 lParam 参数是 NMLVDISPINFO 结构的地址。 此结构的 成员是 一个 LVITEM 结构,其 iItem 成员标识该项。 如果取消编辑,LVITEM 结构的 pszText 成员为 NULL;否则,pszText 是已编辑文本的地址。 如果父窗口想要保留新标签,则父窗口负责更新项的标签。

List-View颜色

应用程序可以检索和设置列表视图控件的三种颜色。

Color 用于检索和设置颜色的消息
文本颜色 LVM_GETTEXTCOLORLVM_SETTEXTCOLOR
文本背景色 LVM_GETTEXTBKCOLORLVM_SETTEXTBKCOLOR
窗口背景色 LVM_SETBKCOLOR LVM_GETBKCOLOR

 

若要更显著地自定义列表视图控件的外观,请使用 NM_CUSTOMDRAW (列表视图) 或使用视觉样式 (请参阅 视觉样式启用视觉样式) 。

按组排列列表项

使用列表视图控件的分组功能,可以直观地对逻辑相关的项集进行分组。 可以根据项属性、属性或其他特征创建组。 这些组通常在屏幕上由包含组名称的水平标题分隔。 以下屏幕截图显示了已分组的项。

列表视图控件的屏幕截图,其中狗在一个组中,猫在另一个组中

使用 LVGROUP 结构来存储有关组的信息,例如页眉和页脚文本、组的当前状态等。 分组 API 包含的消息使你能够通过以下方式管理组和组元素:将项添加到组、将组添加到视图、对组项排序,以及查询组的项大小和其他信息。 例如,可以使用 ListView_SetGroupMetricsListView_GetGroupMetrics 宏来设置和检索每个组的显示参数。

除列表视图外,所有视图都提供分组功能。 它在具有 LVS_OWNERDATA 样式的控件上不可用。

有关详细信息,请参阅 使用List-View控件

插入标记

插入标记向用户显示拖动项的位置。 当用户将项拖动到 “开始 ”菜单或“快速启动”栏时,当前会显示插入标记。 插入标记也适用于设置为自动排列的列表。 当用户将某项拖至两个其他项之间的位置时,插入标记会显示该项的预计新位置。 以下屏幕截图显示了插入标记。

在列表视图控件中将一个文件拖动到另两个文件时显示插入标记的屏幕截图

插入标记 API 元素通过提供执行命中检测的消息和标志、按项目指定插入标记的位置和外观以及查询有关插入标记当前大小和外观的信息的消息和标志来实现插入标记的放置。

另请参阅