Сведения о элементах управления "Представление списка"

См. пример элемента управления Virtual Listview.

Элемент управления представлением списка — это окно, отображающее коллекцию элементов. Элементы управления представлением списка предоставляют несколько способов упорядочивания и отображения элементов и гораздо более гибкие, чем простые поля списка. Например, дополнительные сведения о каждом элементе можно отобразить в столбцах справа от значка и метки.

Стили и представления представления списка

Элементы управления представлением списка могут отображаться в пяти разных представлениях. Стиль окна элемента управления указывает представление по умолчанию. Дополнительные стили окон определяют выравнивание элементов и функций, относящихся к элементу управления. В следующей таблице описываются представления.

Имя представления Description
Представление значка Определяется стилем окна LVS_ICON или путем передачи LV_VIEW_ICON с сообщением LVM_SETVIEW. Каждый элемент отображается как значок полного размера с меткой под ним. Пользователь может перетащить элементы в любое расположение в окне представления списка.
Представление маленьких значков Определяется стилем окна LVS_SMALLICON или путем передачи LV_VIEW_SMALLICON с LVM_SETVIEW. Каждый элемент отображается как небольшой значок с меткой справа от него. Пользователь может перетащить элементы в любое расположение.
Представление списка Определяется стилем окна LVS_LIST или путем передачи LV_VIEW_LIST с LVM_SETVIEW. Каждый элемент отображается как небольшой значок с меткой справа от него. Элементы упорядочены в столбцах, и пользователь не может перетащить их в произвольное расположение.
Представление отчета (подробности) Определяется стилем окна LVS_REPORT или путем передачи LV_VIEW_DETAILS с LVM_SETVIEW. Каждый элемент отображается в собственной строке с информацией, упорядоченной в столбцах. Самый левый столбец всегда остается оправданным и содержит маленький значок и метку. Последующие столбцы содержат вложенные объекты, указанные приложением. Каждый столбец имеет заголовок, если вы также не указываете стиль окна LVS_NOCOLUMNHEADER .
Мозаика Версия 6 и более поздняя. Указывается путем передачи LV_VIEW_TILE с LVM_SETVIEW. Каждый элемент отображается как полноразмерный значок с меткой одной или нескольких строк рядом с ней.

 

На следующем снимке экрана используются представления для отображения различных объемов информации о каждом из семи домашних животных. В представлениях показано, как информация может отображаться в Windows Vista. Стили визуальных элементов для элемента управления были заданы на тему "Обозреватель" с помощью SetWindowTheme.

На следующем снимке экрана показано представление сведений.

screen shot that shows information in five columns and seven rows

На следующем снимке экрана показано представление значка.

screen shot that shows only the name of each pet and an icon indicating the species

На следующем снимке экрана показано представление списка.

screen shot that shows, for each pet, a large icon next the text of the pet's name, breed, and price

На следующем снимке экрана показано представление плитки.

tile view.

После создания элемента управления "Представление списка" можно изменить тип представления. Чтобы получить и изменить стиль окна, используйте функции GetWindowLong и SetWindowLong. Чтобы определить стили окон текущего представления, используйте значение LVS_TYPEMASK .

Вы можете управлять способом упорядочивание элементов в представлении значков или небольших значков, указав стиль окна LVS_ALIGNTOP (по умолчанию) или LVS_ALIGNLEFT.

Вы можете изменить выравнивание после создания элемента управления представлением списка. Чтобы определить текущее выравнивание, используйте значение LVS_ALIGNMASK .

Дополнительные стили окон предоставляют другие параметры, например, может ли пользователь изменять метки или выбирать несколько элементов одновременно. Полный список см. в разделе "Стили окна представления списка".

Стили расширенного представления списка

Стили элементов управления расширенным представлением списка предоставляют такие параметры, как проверка поля, плоские полосы прокрутки, линии сетки и горячее отслеживание. Полный список см. в разделе "Стили расширенного представления списка". Вы не обращаетесь к стилям расширенного представления списка таким же образом, как и стандартные стили окон. Функции GetWindowLong и SetWindowLong не используются для изменения расширенного стиля.

Существует два сообщения, которые задают и извлекают сведения о расширенном стиле, LVM_SETEXTENDEDLISTVIEWSTYLE и LVM_GETEXTENDEDLISTVIEWSTYLE. Вместо явной отправки сообщений можно использовать следующие соответствующие макросы: ListView_SetExtendedListViewStyle, ListView_SetExtendedListViewStyleEx и ListView_GetExtendedListViewStyle.

Стиль представления виртуального списка

Представление виртуального списка — это элемент управления представлением списка с LVS_OWNERDATA стилем. Этот стиль позволяет элементу управления обрабатывать миллионы элементов, так как владелец получает бремя управления данными элементов. Это позволяет использовать элемент управления представлением виртуального списка с большими базами данных, где уже существуют определенные методы доступа к данным.

Элемент управления представления виртуального списка поддерживает очень мало сведений о элементах. За исключением сведений о выборе элемента и фокусе, владелец элемента управления должен управлять всеми сведениями об элементах. Другие процессы запрашивают сведения о элементе от владельца с помощью кодов уведомлений LVN_GETDISPINFO .

Так как этот тип элемента управления списка предназначен для больших наборов данных, рекомендуется кэшировать запрошенные данные элементов для повышения производительности извлечения. Представление списка предоставляет механизм указания кэша для оптимизации кэша. Указание реализуется в виде кода уведомления LVN_ODCACHEHINT .

Создание элемента управления "Представление виртуального списка"

Вы создаете элементы управления представления виртуальных списков с помощью функции CreateWindow или CreateWindowEx, указав стиль окна LVS_OWNERDATA в составе параметра функции dwStyle. Динамическое переключение на LVS_OWNERDATA стиль не поддерживается.

Стиль LVS_OWNERDATA можно использовать в сочетании с большинством других стилей окон, кроме стиля LVS_SORTASCENDING или LVS_SORTDESCENDING. Все элементы управления представлением виртуального списка по умолчанию заданы в стиле LVS_AUTOARRANGE.

Чтобы включить отображение элементов в списке, сначала необходимо отправить сообщение LVM_SETITEMCOUNT явным образом или с помощью макроса ListView_SetItemCountEx.

Следующие сообщения не поддерживаются в стиле LVS_OWNERDATA: LVM_ENABLEGROUPVIEW, LVM_GETITEMTEXT, LVM_SETTILEINFO и LVM_MAPIDTOINDEX.

Проблемы совместимости

Все четыре стиля представления списка — значок, маленький значок, список и представление отчета — поддерживают стиль LVS_OWNERDATA. Элементы управления представления списка, которые имеют стиль LVS_OWNERDATA , не хранят никакие сведения, относящиеся к элементам. Таким образом, единственными допустимыми флагами состояния элемента, которые можно применить к элементу, являются LVIS_SELECTED и LVIS_FOCUSED. Другие сведения о состоянии не хранятся. В частности, элемент управления представлением списка не поддерживает состояние или наложение изображений для каждого элемента. Однако вы можете запрашивать приложение для этих изображений, отправив ему LVM_SETCALLBACKMASK сообщение.

Большинство сообщений управления представлением списка и связанных макросов полностью поддерживаются. Однако некоторые сообщения имеют ограничения или неподдерживаются при использовании стиля LVS_OWNERDATA. В следующей таблице перечислены затронутые сообщения.

Message Ограничение
LVM_ARRANGE Не поддерживает стиль LVA_SNAPTOGRID .
LVM_DELETEALLITEMS Задает число элементов равным нулю и очищает все внутренние переменные выбора, но на самом деле не удаляет элементы. Он делает обратный вызов уведомлений.
LVM_DELETEITEM Поддерживается только для целостности выделения и не удаляет элемент.
LVM_GETITEMSTATE Возвращает только состояния фокуса и выделения (т. е. эти состояния, хранящиеся элементом управления представлением списка).
LVM_GETNEXTITEM Не поддерживает условия поиска для просмотра списка LVNI_CUT, LVNI_HIDDEN или LVNI_DROPHILITED. Поддерживаются все остальные критерии.
LVM_GETWORKAREAS Не поддерживается.
LVM_INSERTITEM Поддерживается только для целостности выбора.
LVM_SETITEM Не поддерживается. Чтобы задать состояние элемента, используйте сообщение ListView_SetItemState .
LVM_SETITEMCOUNT Задает количество элементов, которые в настоящее время находятся в списке. Если элемент управления представлением списка отправляет уведомление, запрашивающее данные для любого элемента до максимального набора, владелец должен быть готов предоставить эти данные. Параметры сообщения поддерживают элементы управления виртуальным представлением списка.
LVM_SETITEMPOSITION Не поддерживается.
LVM_SETITEMSTATE Позволяет изменять только состояния выделения и фокуса для элемента.
LVM_SETITEMTEXT Не поддерживается. Это обязанность приложения поддерживать тексты элементов.
LVM_SETWORKAREAS Не поддерживается.
LVM_SORTITEMS Не поддерживается. Приложение несет ответственность за представление элементов в нужном порядке.

 

Обработка кодов уведомлений для элемента управления "Представление виртуального списка"

Элементы управления представления списка с стилем LVS_OWNERDATA отправляют те же коды уведомлений, что и другие элементы управления представления списка, а также два дополнительных элемента управления: LVN_ODCACHEHINT и LVN_ODFINDITEM. Ниже приведены наиболее распространенные уведомления, которые элемент управления представления списка с LVS_OWNERDATA стилем отправляет.

Notification Description
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 включает в себя два целочисленных члена iFromи iTo, которые представляют инклюзивные конечные точки диапазона элементов, которые, скорее всего, потребуются. Владелец должен быть готов загрузить кэш с информацией об элементе для каждого из элементов в рекомендуемом диапазоне.

Элемент управления списка часто требует сведений об элементе для первого элемента (смещение 0). Код уведомления LVN_ODCACHEHINT может не всегда включать элемент 0, но он всегда должен быть включен в кэш.

К последним элементам списка часто обращаются. Таким образом, владелец может сохранить второй кэш, содержащий элементы в конце списка. Запрошенный диапазон от LVN_ODCACHEHINT можно проверка в конце кэша, чтобы сделать его доступным автоматически, а не перезагрузить один и тот же конечный диапазон каждый раз.

Рабочие области представления списка

Элементы управления представления списка поддерживают рабочие области, которые являются прямоугольными виртуальными областями, которые элемент управления представления списка использует для упорядочивания элементов. Рабочая область не является окном и не может иметь видимую границу. По умолчанию элемент управления "Представление списка" не имеет рабочих областей. Создав рабочую область, можно создать пустую границу слева, сверху или справа от элементов или отобразить горизонтальную полосу прокрутки, если обычно не будет.

При создании рабочей области элементы, лежащие в рабочей области, становятся членами рабочей области. Аналогичным образом, если элемент перемещается в рабочую область, элемент становится членом этой рабочей области. Если элемент не лежит в рабочей области, он автоматически становится членом первой рабочей области (индекс 0). Чтобы разместить новый элемент в определенной рабочей области, необходимо сначала создать элемент, а затем использовать LVM_SETITEMPOSITION или сообщение LVM_SETITEMPOSITION32 для перемещения его в нужную рабочую область.

На следующем рисунке показан пример элемента управления представлением списка, который содержит четыре рабочие области, каждая из которых состоит из разных квадрантов клиентской области.

screen shot of a list-view control with one working area in each quadrant of the client area

Для создания разных областей в одном представлении можно использовать несколько рабочих областей. Вы можете создавать области в одном представлении с разными значениями. Например, представление файловой системы может иметь область для файлов чтения и записи и другой области для файлов только для чтения. Пользователь может классифицировать элементы, размещая их в разных рабочих областях. Если файл перемещается в область только для чтения, он автоматически станет доступен только для чтения.

Несколько рабочих областей могут пересекаться, но все элементы, лежащие в пересечении, становятся членами области с более низким индексом; поэтому лучше избежать этой ситуации. При сортировке нескольких рабочих областей элементы сортируются по сравнению с другими элементами в одной рабочей области.

Количество рабочих областей можно получить с сообщением LVM_GETNUМБ EROFWORKAREAS. Рабочие области изменяются с сообщением LVM_SETWORKAREAS и могут быть извлечены с помощью сообщения LVM_GETWORKAREAS. Оба этих сообщения принимают адрес массива структур RECT в виде lParam и количества структур RECT в качестве wParam. Левая и верхняя части этих структур указывают координаты верхнего левого угла (источника) рабочей области, а правые и нижние элементы указывают правый нижний угол рабочей области. Все координаты находятся в клиентских координатах представления списка. Максимально допустимое количество рабочих областей определяется значением LV_MAX_WORKAREAS .

Изменение рабочей области не влияет на элементы управления представлением списка, имеющие представление LVS_LIST или LVS_REPORT представления, но рабочие области будут поддерживаться при изменении типа представления. С помощью представлений LVS_ICON и LVS_SMALLICON рабочая область можно изменить, чтобы изменить способ отображения элементов. Если ширина рабочей области (справа - слева) больше ширины клиента элемента управления, элементы будут упакованы по этой ширине и горизонтальной полосе прокрутки. Что делает ширину рабочей области более узкой, чем ширина клиентской области элемента управления, приводит к тому, что элементы будут упакованы в рабочую область, а не в клиентскую область. Задание левого или верхнего элемента положительному значению приводит к отображению элементов, начиная с рабочей области, создавая пустое пространство между краем элемента управления и элементами. Пустое пространство также можно создать между правым краем элемента управления и элементами, делая ширину рабочей области меньше ширины клиента элемента управления.

Списки изображений представления списка

По умолчанию элемент управления представлением списка не отображает изображения элементов. Чтобы отобразить изображения элементов, необходимо создать списки изображений и связать их с элементом управления. Элемент управления представлением списка может содержать три списка изображений:

  • Список изображений, содержащий полноразмерные значки, отображаемые при отображении элемента управления в представлении значков.
  • Список изображений, содержащий небольшие значки, отображаемые при представлении небольших значков, представлении списка или представлении отчета.
  • Список изображений, содержащий изображения состояния, отображаемые слева от полного размера или небольшого значка. Вы можете использовать изображения состояния, такие как проверка и снятые проверка поля, чтобы указать состояния элементов, определяемых приложением. Изображения состояния отображаются в представлении значков, представлении небольших значков, представлении списка и представлении отчета.

Полноразмерные и маленькие списки изображений значков также могут содержать изображения наложения, которые предназначены для прозрачного рисования значков элементов.

Чтобы использовать изображения наложения в элементе управления представлением списка, выполните указанные ниже действия.

  1. Вызовите функцию ImageList_SetOverlayImage, чтобы назначить индекс наложения изображения изображениям в полноразмерных и небольших списках значков. Изображение наложения определяется одним индексом.
  2. Индекс изображения наложения можно связать с элементом при вызове макроса ListView_InsertItem или ListView_SetItem . Используйте макрос INDEXTOOVERLAYMASK, чтобы указать индекс изображения наложения в элементе состояния структуры LVITEM элемента. Необходимо также задать LVIS_OVERLAYMASK биты в члене stateMask .

Если указан список изображений состояния, элемент управления представления списка резервирует пространство слева от значка каждого элемента для изображения состояния.

Чтобы связать изображение состояния с элементом, используйте макрос INDEXTOSTATEIMAGEMASK, чтобы указать индекс изображения состояния в элементе состояния структуры LVITEM. Индекс определяет изображение в списке образов состояния элемента управления. Хотя индексы списков изображений основаны на нулях, элемент управления использует одноуровневые индексы для идентификации образов состояний. Индекс изображения состояния от нуля указывает, что элемент не имеет образа состояния.

По умолчанию при уничтожении элемента управления представлением списка он уничтожает списки изображений, назначенные ему. Однако если элемент управления представлением списка имеет стиль окна LVS_SHAREIMAGELISTS , приложение отвечает за уничтожение списков изображений, когда они больше не используются. Этот стиль следует указать, если вы назначаете одинаковые списки изображений нескольким элементам управления представления списка; в противном случае несколько элементов управления могут попытаться уничтожить тот же список изображений.

Элементы представления списка и вложенные элементы

Каждый элемент в элементе управления списком содержит значок, метку, текущее состояние и определенное приложением значение. С помощью сообщений представления списка можно добавлять, изменять и удалять элементы, а также получать сведения о элементах.

Каждый элемент может иметь один или несколько дочерних элементов. Подсети — это строка, которая в представлении отчета отображается в столбце, отдельном от значка и метки элемента. Чтобы указать текст подсети, используйте сообщение LVM_SETITEMTEXT или LVM_SETITEM . Все элементы в элементе управления представлением списка имеют одинаковое количество вложенных элементов. Количество вложенных элементов определяется числом столбцов в элементе управления представлением списка. При добавлении столбца в элемент управления представлением списка необходимо указать связанный индекс подсети.

Структура LVITEM определяет элемент представления списка или подсеть. Элемент iItem — это отсчитываемый от нуля индекс элемента. Элемент iSubItem — это одноуровневый индекс подсети или ноль, если структура содержит сведения о элементе. Дополнительные члены указывают текст элемента, значок, состояние и данные элемента. Данные элемента — это определяемое приложением значение, связанное с элементом представления списка.

Чтобы добавить элемент в элемент управления представлением списка, используйте сообщение LVM_INSERTITEM, указав адрес структуры LVITEM. Перед добавлением нескольких элементов можно отправить элемент управления LVM_SETITEMCOUNT сообщение, указав количество элементов, которые элемент управления в конечном итоге будет содержать. Это сообщение позволяет элементу управления "Представление списка" перераспределить внутренние структуры данных только один раз, а не каждый раз при добавлении элемента. Вы можете определить количество элементов в элементе управления представлением списка с помощью сообщения LVM_GETITEMCOUNT. При добавлении большого количества элементов в элемент управления представлением списка можно ускорить процесс, отключив перерисовку перед добавлением элементов, а затем включить перерисовку после добавления элементов. Используйте сообщение WM_SETREDRAW для включения и отключения перерасписи.

Чтобы изменить атрибуты элемента представления списка, используйте сообщение LVM_SETITEM, указав адрес структуры LVITEM. Элемент маски этой структуры указывает атрибуты элемента, которые нужно изменить. Например, чтобы изменить только текст элемента или дочернего элемента, используйте сообщение LVM_SETITEMTEXT .

Чтобы получить сведения о элементе представления списка, используйте сообщение LVM_GETITEM, указав адрес структуры LVITEM для заполнения. Элемент маски этой структуры указывает атрибуты элемента, которые необходимо извлечь. Чтобы получить только текст элемента или дочернего элемента, используйте сообщение LVM_GETITEMTEXT .

Чтобы удалить элемент представления списка, используйте сообщение LVM_DELETEITEM . Все элементы в элементе управления представлением списка можно удалить с помощью сообщения LVM_DELETEALLITEMS.

Состояния элементов представления списка

Состояние элемента — это значение, указывающее доступность элемента, указывающее действия пользователя или в противном случае отражает состояние элемента. Элемент управления представлением списка изменяет некоторые биты состояния, например, когда пользователь выбирает элемент. Приложение может изменить другие биты состояния, чтобы отключить или скрыть элемент или указать изображение наложения или изображение состояния. Дополнительные сведения о наложении изображений и изображениях состояния см. в разделе "Списки изображений представления списка".

Состояние элемента определяется членом государства структуры LVITEM. При указании или изменении состояния элемента член stateMask указывает, какие биты состояния необходимо изменить. Состояние элемента можно изменить с помощью сообщения LVM_SETITEMSTATE. Состояние элемента можно указать при создании или при изменении его атрибутов с помощью сообщения LVM_SETITEM. Чтобы определить текущее состояние элемента, используйте сообщение LVM_GETITEMSTATE или LVM_GETITEM .

Чтобы задать изображение наложения элемента, элемент stateMask структуры LVITEM должен включать значение LVIS_OVERLAYMASK, а член государства должен включать одноуровневый индекс изображения наложения, смещенного 8 битами, с помощью макроса INDEXTOOVERLAYMASK. Индекс может быть равен нулю, чтобы не указывать изображение наложения.

Чтобы задать изображение состояния элемента, член stateMask структуры LVITEM должен включать значение LVIS_STATEIMAGEMASK, а член государства должен включать одноуровневый индекс изображения состояния, смещенного влево 12 бит, с помощью макроса INDEXTOSTATEIMAGEMASK. Индекс может быть равен нулю, чтобы не указывать образ состояния.

Элементы обратного вызова и маска обратного вызова

Для каждого элемента элемент управления представлением списка обычно хранится текст метки, индекс списка изображений значков элемента и набор битовых флагов для состояния элемента. Вы можете определить элементы обратного вызова или изменить маску обратного вызова элемента управления, чтобы указать, что приложение, а не элемент управления, сохраняет некоторые или все эти сведения. Вы можете использовать обратные вызовы, если приложение хранит некоторые из этих сведений.

Элемент обратного вызова в элементе управления представлением списка — это элемент , для которого приложение хранит текст или индекс значка или оба элемента. При отправке сообщения LVM_INSERTITEM можно определить элементы обратного вызова, чтобы добавить элемент в элемент управления представлением списка. Если приложение хранит текст для элемента или дочернего элемента, задайте для элемента pszText структуры LVITEM элемента значение LPSTR_TEXTCALLBACK. Если приложение хранит индекс значка для элемента, задайте элемент iImage структуры LVITEM элемента I_IMAGECALLBACK.

Маска обратного вызова элемента управления представлением списка — это набор битовых флагов, указывающих состояния элементов, для которых приложение, а не элемент управления, сохраняет текущие данные. Маска обратного вызова применяется ко всем элементам элемента управления, в отличие от обозначения элемента обратного вызова, которое применяется к конкретному элементу. Маска обратного вызова по умолчанию равна нулю, что означает, что элемент управления представления списка хранит все сведения о состоянии элемента. После создания элемента управления представления списка и инициализации его элементов можно отправить LVM_SETCALLBACKMASK сообщение, чтобы изменить маску обратного вызова. Чтобы получить текущую маску обратного вызова, отправьте сообщение LVM_GETCALLBACKMASK .

Если элемент управления представлением списка должен отображать или сортировать элемент представления списка, для которого приложение хранит сведения о обратном вызове, элемент управления отправляет код уведомления LVN_GETDISPINFO в родительское окно элемента управления. Это сообщение указывает структуру NMLVDISPINFO , содержащую тип сведений, необходимых для извлечения, и определяет элемент или дочерний объект. Родительское окно должно обрабатывать LVN_GETDISPINFO для предоставления запрошенных данных.

Если элемент управления представлением списка обнаруживает изменение сведений о обратном вызове элемента, например изменение текста, значка или сведений о состоянии, элемент управления отправляет код уведомления LVN_SETDISPINFO , чтобы уведомить вас об изменении.

Если изменить атрибуты или биты состояния элемента обратного вызова, используйте сообщение LVM_UPDATE , чтобы принудительно перезапись элемента управления. Это сообщение также приводит к тому, что элемент управления упорядочивает его элементы, если он имеет стиль LVS_AUTOARRANGE. Вы можете использовать сообщение LVM_REDRAWITEMS для перерасхода диапазона элементов, недействив соответствующие части клиентской области элемента управления представления списка.

Эффективно используя элементы обратного вызова и маску обратного вызова, можно убедиться, что каждый атрибут элемента поддерживается только в одном месте. Это может упростить приложение, но единственным сохраненным пространством является память, которая в противном случае потребуется для хранения меток элементов и текста подсети.

Положение элемента представления списка

Каждый элемент представления списка имеет позицию и размер, которую можно получить и задать с помощью сообщений. Вы также можете определить, какой элемент, если он есть, находится в указанной позиции. Позиция элементов представления списка указывается в координатах представления, которые являются координатами клиента смещением позиции прокрутки.

Чтобы получить и задать позицию элемента, используйте LVM_GETITEMPOSITION и LVM_SETITEMPOSITION сообщения. LVM_GETITEMPOSITION работает для всех представлений, но LVM_SETITEMPOSITION работает только для представлений значков и небольших значков.

Вы можете определить, какой элемент находится в определенном расположении с помощью сообщения LVM_HITTEST.

Чтобы получить ограничивающий прямоугольник для элемента списка или только для его значка или метки, используйте сообщение LVM_GETITEMRECT .

Упорядочение, сортировка и поиск элементов

Вы можете использовать сообщения представления списка для упорядочивания и сортировки элементов и поиска элементов на основе их атрибутов или позиций. Упорядочение элементов перепозиции для выравнивания по сетке, но индексы элементов не изменяются. Сортировка изменяет последовательность элементов (и их соответствующих индексов), а затем переместит их соответствующим образом. Элементы можно упорядочивать только в представлениях значков и небольших значков, но можно сортировать элементы в любом представлении. Чтобы найти элементы, вы отправляете сообщения представления списка, которые указывают расположение элемента или свойство.

Чтобы упорядочить элементы, используйте сообщение LVM_ARRANGE . Вы можете убедиться, что элементы упорядочены в любое время, указав стиль окна LVS_AUTOARRANGE .

Чтобы сортировать элементы, используйте сообщение LVM_SORTITEMS . При сортировке по этому сообщению вы указываете функцию обратного вызова, определяемую приложением, которая вызывает вызовы элемента управления представлением списка для сравнения относительного порядка всех двух элементов. Элемент управления передает функции сравнения данные элемента, связанные с каждым из двух элементов. Данные элемента — это значение, указанное в элементе lParam структуры LVITEM элемента при вставке в список. Указав соответствующие данные элемента и предоставив соответствующую функцию сравнения, можно сортировать элементы по метки, по любому подсети или по любому другому свойству. Обратите внимание, что элементы сортировки не переупорядочения соответствующих подсайтов. При переупорядочении элементов соответствующие вложенные элементы переносятся вместе с ними; То есть целые строки хранятся вместе. Чтобы упорядочить столбцы отдельно друг от друга, отсоединяя вложенные элементы от их элементов, необходимо повторно создать столбцы после сортировки с помощью LVM_SETITEM.

Вы можете убедиться, что элемент управления представлением списка всегда отсортирован, указав стиль окна LVS_SORTASCENDING или LVS_SORTDESCENDING. Элементы управления с этими стилями используют текст метки элементов для сортировки по возрастанию или убыванию. Невозможно указать функцию сравнения при использовании этих стилей окон. Если элемент управления представлением списка содержит любой из этих стилей, сообщение LVM_INSERTITEM завершится ошибкой, если вы попытаетесь вставить элемент с LPSTR_TEXTCALLBACK как элемент pszText структуры LVITEM.

Элемент представления списка с определенными свойствами можно найти с помощью сообщения LVM_FINDITEM. Вы можете найти элемент представления списка, который находится в указанном состоянии и имеет указанное отношение к указанному элементу с помощью сообщения LVM_GETNEXTITEM. Например, можно получить следующий выбранный элемент справа от указанного элемента.

Столбцы представления списка

Столбцы управляют способом отображения элементов и их дочерних элементов в представлении отчета. Каждый столбец имеет заголовок и ширину и связан с определенным дочерним элементом; Подitem ноль — это значок и метка элемента. Атрибуты столбца определяются структурой LVCOLUMN .

Чтобы добавить столбец в элемент управления представлением списка, используйте сообщение LVM_INSERTCOLUMN . Чтобы удалить столбец, используйте сообщение LVM_DELETECOLUMN .

Примечание.

Удаление столбца ноль элемента управления представлением списка поддерживается только в ComCtl32.dll версии 6 и более поздних версий. Версия 5 также поддерживает удаление нулевого столбца, но только после использования CCM_SETVERSION для установки версии 5 или более поздней. Версии до версии 5 не поддерживают удаление столбца ноль.

 

Вы можете получить и изменить свойства существующего столбца с помощью LVM_GETCOLUMN и LVM_SETCOLUMN сообщений. Чтобы получить или изменить ширину столбца, используйте LVM_GETCOLUMNWIDTH и LVM_SETCOLUMNWIDTH сообщения.

Если LVS_NOCOLUMNHEADER стиль окна не указан, заголовки столбцов отображаются в представлении отчета. Пользователь может щелкнуть заголовок столбца, что приводит к отправке кода уведомления LVN_COLUMNCLICK в родительское окно. Как правило, родительское окно сортирует элемент управления представлением списка по указанному столбцу при нажатии этого щелчка. Пользователь также может перетаскивать направляющие столбцов между заголовками для размера столбцов.

Элементы управления представлением списка могут отображать изображения рядом с заголовками столбцов. Чтобы реализовать эту функцию, укажите значение LVCF_IMAGE и назначьте индекс изображения элементу iImage в структуре LVCOLUMN.

Элементы управления представлением списка могут задать порядок отображения столбцов. Чтобы реализовать эту функцию, укажите значение LVCF_ORDER и назначьте порядок столбцов члену iOrder в структуре LVCOLUMN. Порядок столбцов отсчитывается от нуля и находится в левом порядке направо. Например, ноль указывает самый левый столбец.

Положение прокрутки представления списка

Если стиль окна LVS_NOSCROLL не указан, можно прокрутить элемент управления представлением списка, чтобы отобразить больше элементов, чем можно в клиентской области элемента управления. Вы можете получить позицию прокрутки элемента управления списком и связанные сведения, прокрутить элемент управления представлением списка по указанному количеству или прокрутить элемент управления представлением списка таким образом, чтобы указанный элемент списка был видимым.

В представлении значков или в представлении небольших значков текущая позиция прокрутки определяется источником представления. Источник представления — это набор координат относительно видимой области элемента управления представлением списка, которые соответствуют координатам представления (0, 0). Чтобы получить источник текущего представления, используйте сообщение LVM_GETORIGIN . Это сообщение должно использоваться только в представлении значков или небольших значков; возвращает ошибку в представлении списка или отчета.

В представлении списка или отчета текущая позиция прокрутки определяется верхним индексом. Верхний индекс — это индекс первого видимого элемента в элементе управления "Представление списка". Чтобы получить текущий верхний индекс, используйте сообщение LVM_GETTOPINDEX . Это сообщение возвращает допустимый результат только в представлении списка или отчета; он возвращает ноль в представлении значков или небольшого значка.

Вы можете использовать сообщение LVM_GETVIEWRECT для получения ограничивающего прямоугольника всех элементов в элементе управления представлением списка относительно видимой области элемента управления.

Сообщение LVM_GETCOUNTPERPAGE возвращает количество элементов, которые помещаются на одну страницу элемента управления представлением списка. Это сообщение возвращает допустимый результат только в представлениях списка и отчета; в представлениях значков и небольших значков возвращает общее количество элементов.

Чтобы прокрутить элемент управления представлением списка по определенному количеству , используйте сообщение LVM_SCROLL . Используя сообщение LVM_ENSUREVISIBLE, можно прокрутить элемент управления представлением списка( при необходимости), чтобы убедиться, что указанный элемент отображается.

Редактирование меток представления списка

Элемент управления представления списка с стилем окна LVS_EDITLABELS позволяет пользователю изменять метки элементов. Пользователь начинает редактирование, щелкнув метку элемента с фокусом. Кроме того, приложение может автоматически изменяться с помощью сообщения LVM_EDITLABEL. Элемент управления "Представление списка" уведомляет родительское окно при начале редактирования и при отмене или завершении. После завершения редактирования родительское окно отвечает за обновление метки элемента при необходимости.

При начале редактирования меток элемент управления редактирования создается, позиционируется и инициализируется. Перед отображением элемент управления представлением списка отправляет родительское окно код уведомления LVN_BEGINLABELEDIT . Если необходимо изменить процесс редактирования меток, можно реализовать обработчик для этого уведомления.

Одним из способов использования обработчика уведомлений LVN_BEGINLABELEDIT является управление метками, которые пользователь может изменять. Чтобы предотвратить редактирование меток, верните ненулевое значение. Чтобы настроить редактирование меток, получите дескриптор для элемента управления редактирования, отправив LVM_GETEDITCONTROL сообщение в элемент управления представления списка. После этого можно настроить элемент управления редактирования, отправив обычные EM_XXX сообщения. Например, чтобы ограничить объем текста, который пользователь может ввести, отправьте элемент управления редактирования EM_LIMITTEXT сообщение. Вы можете изменить текст элемента управления редактирования по умолчанию с помощью SetWindowText. Можно даже подклассить элемент управления редактирования для перехвата и отключения карта недопустимых символов.

При отмене или завершении редактирования меток элемент управления представлением списка отправляет родительское окно LVN_ENDLABELEDIT код уведомления. Параметр lParam — это адрес структуры NMLVDISPINFO . Элемент этой структуры — это структура LVITEM, член iItem которой определяет элемент. Если изменение отменено, элемент pszText структуры LVITEM имеет значение NULL; в противном случае pszText — адрес измененного текста. Родительское окно отвечает за обновление метки элемента, если она хочет сохранить новую метку.

Цвета представления списка

Приложение может получить и задать три цвета для элемента управления представлением списка.

Color Сообщения, используемые для извлечения и задания цветов
Цвет текста LVM_GETTEXTCOLOR, LVM_SETTEXTCOLOR
Цвет фона текста LVM_GETTEXТБ KCOLOR, LVM_SETTEXТБ KCOLOR
Цвет фона окна LVM_GEТБ KCOLOR, LVM_SEТБ KCOLOR

 

Чтобы значительно настроить внешний вид элемента управления представлением списка, используйте NM_CUSTOMDRAW (представление списка) или используйте визуальные стили (см. статью "Стили визуальных элементов" и "Включение визуальных стилей").

Упорядочивание элементов списка по группам

Функции группировки элемента управления представлением списка позволяют визуально группировать логически связанные наборы элементов. Группы можно создавать на основе свойств элементов, атрибутов или других характеристик. Обычно эти группы разделяются на экране горизонтальным заголовком, содержащим имя группы. На следующем снимке экрана показаны сгруппированные элементы.

screen shot of a list-view control, with dogs in one group and cats in another group

Структура LVGROUP используется для хранения сведений о группе, например текста верхнего и нижнего колонтитула, текущего состояния группы и т. д. API группирования включает сообщения, позволяющие управлять группами и элементами группы, добавляя элементы в группы, добавляя группы в представления, сортировку элементов группы и запрашивая группы для размера элементов и других сведений. Например, можно задать и извлечь параметры отображения для каждой группы с помощью макросов ListView_SetGroupMetrics и ListView_GetGroupMetrics.

Группирование доступно во всех представлениях, кроме представления списка. Он недоступен для элементов управления с LVS_OWNERDATA стилем.

Дополнительные сведения см. в разделе "Использование элементов управления "Представление списка".

Метки вставки

Метки вставки показывают пользователям, где будут помещены перетаскиваемые элементы. В настоящее время метки вставки отображаются при перетаскивании элемента в меню "Пуск " или панели быстрого запуска. Метка вставки также работает для списков, для которых задано значение autoarrange. Когда пользователь перетаскивает элемент на точку между двумя другими элементами, метка вставки показывает ожидаемое новое расположение элемента. На следующем снимке экрана показана метка вставки.

screen shot that shows an insertion mark when dragging one file between two others in a list-view control

Элементы API вставки позволяют размещать метки вставки, предоставляя сообщения и флаги, которые выполняют обнаружение попаданий, указывая расположение и внешний вид метки вставки по элементу, и запрос сведений о текущем размере и внешнем виде метки вставки.

См. также