Сведения о элементах управления заголовками
Элемент управления заголовком — это окно, которое обычно размещается над столбцами текста или чисел. Он содержит заголовок для каждого столбца, и его можно разделить на части. Пользователь может перетащить разделители, разделяющие части, чтобы задать ширину каждого столбца. На следующем рисунке показан элемент управления заголовком с помеченными столбцами, предоставляющими подробные сведения о файлах в каталоге.
Вы можете создать элемент управления заголовками с помощью функции CreateWindowEx, указав класс окна WC_HEADER и соответствующие стили элементов управления заголовками . Этот класс окна регистрируется при загрузке библиотеки DLL общего элемента управления. Чтобы убедиться, что эта библиотека DLL загружена, используйте функцию InitCommonControlsEx. После создания элемента управления заголовком его можно разделить на части, задать текст в каждой части и управлять внешним видом окна с помощью сообщений окна заголовка.
Элемент управления заголовком можно создать как дочернее окно другого элемента управления, например поле списка. Однако родительский элемент управления не учитывает элемент управления заголовком и не делает поправки на занимаемое им пространство, в результате чего элементы списка будут отображаться позади заголовка. Если вы хотите использовать элемент управления заголовком в поле списка или другом элементе управления, родительский элемент управления должен быть нарисован владельцем, чтобы все элементы отображались в правильном положении.
Элементы управления представления списка уже имеют элементы управления заголовками. Вместо создания элемента управления заголовком для элемента управления представлением списка вы используете LVM_GETHEADER или ListView_GetHeader для получения существующего элемента управления.
- размер и позиция элемента управления заголовком
- элементы
- Owner-Drawn элементы управления заголовками
- фильтры управления заголовками
- Обработка сообщений элемента управления заголовком по умолчанию
Размер и положение элемента управления заголовком
Как правило, необходимо задать размер и позицию элемента управления заголовком, чтобы он соответствовал границам определенного прямоугольника, например клиентской области окна. Используя сообщение 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.
Owner-Drawn элементы управления заголовком
Можно сделать отдельные элементы элемента управления заголовком элементами с прорисовкой владельцем. Используя этот метод, вы получаете больше контроля над внешним видом элемента заголовка, чем в противном случае.
С помощью сообщения HDM_INSERTITEM можно вставить новый элемент, нарисованный владельцем, в элемент управления заголовком или сообщение HDM_SETITEM, чтобы изменить существующий элемент на элемент, нарисованный владельцем. Оба сообщения включают адрес структуры HDITEM, в которой член fmt должен быть установлен на значение HDF_OWNERDRAW.
Когда элемент управления заголовком должен нарисовать элемент с пользовательской прорисовкой, он отправляет сообщение WM_DRAWITEM в родительское окно. Параметр wParam сообщения — это дочерний идентификатор окна элемента управления заголовком, а параметр lParam — адрес структуры DRAWITEMSTRUCT. Родительское окно использует сведения в структуре для рисования элемента. Для элемента управления заголовком, нарисованного владельцем, структура DRAWITEMSTRUCT содержит следующие сведения.
Член | Описание |
---|---|
CtlType | ODT_HEADER тип элемента управления, нарисованного владельцем. |
CtlID | Идентификатор дочернего окна элемента управления заголовком. |
itemID | Индекс нарисованного элемента. |
itemAction | ODA_DRAWENTIRE флаг действия для рисования. |
itemState | ODS_SELECTED флаг действия рисования, если курсор находится на элементе и кнопка мыши нажата. В противном случае этот элемент равен нулю. |
hwndItem | Дескриптор элемента управления заголовком. |
hDC | Дескриптор контекста устройства элемента управления заголовком. |
rcItem | Координаты элемента заголовка, который будет нарисован. Координаты относятся к левому верхнему углу элемента управления заголовком. |
данныеЭлемента | Определяемое приложением 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.
Сообщение | Обработка выполнена |
---|---|
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 | Выбирает новый дескриптор шрифта в контексте устройства для элемента управления заголовками. |