Сведения о элементах управления заголовками
Элемент управления заголовком — это окно, которое обычно размещается над столбцами текста или чисел. Он содержит заголовок для каждого столбца, и его можно разделить на части. Пользователь может перетащить разделители, разделяющие части, чтобы задать ширину каждого столбца. На следующем рисунке показан элемент управления заголовком с помеченными столбцами, предоставляющими подробные сведения о файлах в каталоге.
Элемент управления заголовком можно создать с помощью функции 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 содержит следующие сведения.
Фильтры элементов управления заголовками
Указав стиль окна 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 | Выбирает новый дескриптор шрифта в контексте устройства для элемента управления заголовками. |