Сведения о элементах управления заголовками

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

screen shot of a dialog box with a three-column header control

Элемент управления заголовком можно создать с помощью функции CreateWindowEx, указав класс окна WC_HEADER и соответствующие стили элементов управления заголовками. Этот класс окна регистрируется при загрузке библиотеки DLL общего элемента управления. Чтобы убедиться, что эта библиотека DLL загружена, используйте функцию InitCommonControlsEx . После создания элемента управления заголовком его можно разделить на части, задать текст в каждой части и управлять внешним видом окна с помощью сообщений окна заголовка.

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

Элементы управления представления списка уже имеют элементы управления заголовками. Вместо создания элемента управления заголовком для элемента управления представлением списка вы используете LVM_GETHEADER или ListView_GetHeader для получения существующего элемента управления.

Размер и положение элемента управления заголовком

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

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

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

Товаров

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

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

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

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

Элементы управления заголовками, нарисованными владельцем

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

С помощью сообщения HDM_INSERTITEM можно вставить новый элемент, нарисованный владельцем, в элемент управления заголовком или сообщение HDM_SETITEM, чтобы изменить существующий элемент на элемент, нарисованный владельцем. Оба сообщения включают адрес структуры HDITEM, которая должна иметь элемент fmt, равный значению HDF_OWNERDRAW.

Когда элемент управления заголовком должен нарисовать элемент, нарисованный владельцем, он отправляет сообщение WM_DRAWITEM в родительское окно. Параметр wParam сообщения — это дочерний идентификатор окна элемента управления заголовком, а параметр lParam — адрес структуры DRAWITEMSTRUCT . Родительское окно использует сведения в структуре для рисования элемента. Для элемента, нарисованного владельцем в элементе управления заголовком, структура DRAWITEMSTRUCT содержит следующие сведения.

Элемент Description
CtlType ODT_HEADER тип элемента управления, нарисованного владельцем.
CtlID Идентификатор дочернего окна элемента управления заголовком.
Itemid Индекс нарисованного элемента.
itemAction ODA_DRAWENTIRE флаг действия рисования.
ItemState ODS_SELECTED флаг действия рисования, если курсор находится на элементе и кнопка мыши вниз. В противном случае этот элемент равен нулю.
hwndItem Обработка элемента управления заголовком.
Hdc Обработка контекста устройства элемента управления заголовками.
rcItem Координаты нарисованного элемента заголовка. Координаты относятся к левому верхнему углу элемента управления заголовком.
Itemdata Определяемое приложением 32-разрядное значение, связанное с элементом.

 

Фильтры элементов управления заголовками

Указав стиль окна HDS_FILTERBAR для элемента управления заголовком, можно включить размещение полей редактирования фильтра под заголовками столбцов. Кнопка фильтра отображается рядом с полем редактирования. Вы можете реализовать фильтрацию, отвечая на HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK или коды уведомлений HDN_FILTERCHANGE.

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

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

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

Обработка сообщений элемента управления заголовками по умолчанию

В этом разделе описываются сообщения окна, обрабатываемые процедурой окна для класса WC_HEADER окна.

Message Обработка выполнена
WM_CREATE Инициализирует элемент управления заголовком.
WM_DESTROY Неинициализирует элемент управления заголовком.
WM_ERASEBKGND Заполняет фон элемента управления заголовком с помощью текущего цвета фона элемента управления.
WM_GETDLGCODE Возвращает сочетание значений DLGC_WANTTAB и DLGC_WANTARROWS.
WM_GETFONT Возвращает дескриптор текущего шрифта, который используется элементом управления заголовком для рисования текста.
WM_LBUTTONDBLCLK Записывает входные данные мыши. Если курсор мыши находится на разделителю, элемент управления отправляет код уведомления HDN_BEGINTRACK и начинает перетаскивать разделитель. Если курсор находится на элементе, элемент отображается в состоянии нажатия.
WM_LBUTTONDOWN Аналогично сообщению WM_LBUTTONDBLCLK .
WM_LBUTTONUP Освобождает запись мыши. Если элемент управления отслеживал перемещение мыши, он отправляет код уведомления HDN_ENDTRACK и перерисовывает элемент управления заголовком. В противном случае элемент управления отправляет код уведомления HDN_ITEMCLICK и перерисовывает элемент заголовка, который был щелкнун.
WM_MOUSEMOVE Если разделитель перетаскивается , элемент управления отправляет код уведомления HDN_TRACK и отображает элемент в новой позиции. Если левая кнопка мыши вниз, а курсор находится на элементе, элемент отображается в состоянии нажатия.
WM_NCCREATE Выделяет и инициализирует внутреннюю структуру данных.
WM_NCDESTROY Освобождает ресурсы, выделенные элементом управления заголовком после неинициализации элемента управления заголовком.
WM_PAINT Закрашивает недопустимый регион элемента управления заголовком. Если параметр wParam не имеет значения NULL, элемент управления предполагает, что значение является HDC и краской с помощью этого контекста устройства.
WM_SETCURSOR Задает фигуру курсора в зависимости от того, находится ли курсор на делении или в элементе заголовка.
WM_SETFONT Выбирает новый дескриптор шрифта в контексте устройства для элемента управления заголовками.