- •Глава 12 Современный пользовательский интерфейс
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Основные стили окна
- •Флаги расширенного стиля окна
- •Флаги основного стиля элемента управления общего пользования
- •Флаги стиля, специфичные для конкретного элемента управления
- •Посылка сообщений элементам управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Стили окна панели инструментов
- •Задание изображений на поверхности кнопок
- •Заполнение массива tbbutton
- •Пример создания панели инструментов
- •Перемещение и изменение размеров панели инструментов
- •Поддержка элемента управления подсказка
- •Добавление дочерних окон в панель инструментов
- •Резервирование места для дочернего окна на панели инструментов
- •Создание элементов управления на панели инструментов
- •Изменение размеров панели инструментов с дочерними окнами
- •Поддержка окон подсказки для дочерних окон панели инструментов
- •Изменение конфигурации панели инструментов
- •Строка состояния
- •Создание строки состояния
- •Перемещение и изменение размеров строки состояния
- •Поддержка просмотра меню
- •Просмотр элементов меню
- •Просмотр элементов всплывающего меню
- •Просмотр системного меню
- •Программа gadgets
Посылка сообщений элементам управления общего пользования
После создания окна элемента управления общего пользования для управления его действиями ему посылаются сообщения. Как можно предположить, для этого требуется вызов функции SendMessage с ее традиционными четырьмя параметрами: описатель окна, идентификатор сообщения, значение wParam, значение lParam. Так же как существуют специфические флаги стилей элементов управления общего пользования, так и существуют специфические сообщения.
Альтернативой вызовам функции SendMessage является использование набора макросов языка C, определенных в файле COMMCTRL.H, которые получают специфичный для сообщения набор параметров, осуществляют необходимые преобразования (например, упаковка двух величин типа shorts в одну величину типа lParam), а затем вызывают функцию SendMessage. Возвращаемое значение с целью минимизации числа сообщений компилятора также преобразуется к нужному типу, поскольку значение типа LRESULT, возвращаемое функцией SendMessage, не совпадает с ожидаемым типом возвращаемого значения.
В качестве примера того, как удобны эти макросы, посылающие сообщения элементам управления, рассмотрим сообщение TVM_INSERTITEM для добавления элемента в дерево просмотра. Это сообщение добавляет простой элемент в дерево просмотра. Ниже приведено выражение, использующее вызов функции SendMessage:
hItem = (HTREEITEM) SendMessage ( hwndTV, TVM_INSERTITEM,
0, (LPARAM) (LPTV_INSERTSTRUCT) &tvis ) ;
Ниже показано, как послать то же самое сообщение, используя макрос TreeView_InsertItem:
hItem = TreeView_InsertItem (hwndTV, &tvis) ;
Макрос проще для чтения (имя макроса содержит имя класса окна и имя сообщения), он требует только половину параметров, а дает тот же результат, поскольку он расширяется в вызов функции SendMessage с соответствующим преобразованием параметров. Перейдя однажды на работу с макросами, обратно вернуться будет уже трудно.
(Если вам интересно использование набора аналогичных макросов для предопределенных элементов управления, то вы можете найти их определения в файле WINDOWSX.H. Макросы не документированы ни в одном файле помощи. Они достаточно хорошо сами себя объясняют и просты в использовании. Так же как и применение макросов для элементов управления общего пользования, так и использование макросов из файла WINDOWSX.H может сделать программу проще для написания и чтения.)
Несмотря на то что такие макросы очень полезны, файлы Win32, к сожалению, включают определения лишь для половины элементов управления общего пользования. Файл COMMCTRL.H содержит лишь макроопределения для следующих классов: анимационное изображение, заголовок списка просмотра, список просмотра, набор страниц свойств (в файле PRSHT.H), дерево просмотра и набор закладок для выбора.
Поскольку эти макросы так удобны, на прилагаемом к книге компакт-диске вы найдете набор макросов для других элементов управления общего пользования. Там находятся макросы для следующих классов: горячая клавиша, индикатор процесса, усовершенствованный редактор, строка состояния, панель инструментов, окно подсказки, окно с движком для выбора значения из диапазона и полоса прокрутки, связанная с окном редактирования для изменения значения. Эти макросы находятся в файле \PETZOLD\CHAP12\COMCTHLP.H.
Рис. 12.4. Программа CTLMACRO обеспечивает быстрый доступ к макросам сообщений элементов управления общего пользования
На прилагаемом компакт-диске находится также программа CTLMACRO, которая каталогизирует все макросы элементов управления общего пользования. Как показано на рис. 12.4, программа CTLMACRO элементизирует все макросы элементов управления общего пользования иерархически, и они доступны посредством простого дерева просмотра. Когда вы найдете сообщение, которое вам необходимо, нажмите кнопку Copy для копирования макроса в папку обмена Clipboard. Оттуда его легко вставить в программу, используя редактор, в котором разрабатывается программа.
