
- •Глава 12 Современный пользовательский интерфейс
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Основные стили окна
- •Флаги расширенного стиля окна
- •Флаги основного стиля элемента управления общего пользования
- •Флаги стиля, специфичные для конкретного элемента управления
- •Посылка сообщений элементам управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Стили окна панели инструментов
- •Задание изображений на поверхности кнопок
- •Заполнение массива tbbutton
- •Пример создания панели инструментов
- •Перемещение и изменение размеров панели инструментов
- •Поддержка элемента управления подсказка
- •Добавление дочерних окон в панель инструментов
- •Резервирование места для дочернего окна на панели инструментов
- •Создание элементов управления на панели инструментов
- •Изменение размеров панели инструментов с дочерними окнами
- •Поддержка окон подсказки для дочерних окон панели инструментов
- •Изменение конфигурации панели инструментов
- •Строка состояния
- •Создание строки состояния
- •Перемещение и изменение размеров строки состояния
- •Поддержка просмотра меню
- •Просмотр элементов меню
- •Просмотр элементов всплывающего меню
- •Просмотр системного меню
- •Программа gadgets
Добавление дочерних окон в панель инструментов
Панели инструментов поддерживают только кнопки, поэтому для помещения чего-либо отличного от кнопки в панель инструментов следует создать дочернее окно. Одним из наиболее частых типов окон, добавляемых в панель инструментов, являются комбинированные списки. Поэтому, комбинированные списки будут находиться в фокусе нашего рассмотрения (несмотря на то, что любой тип окна может быть расположен на панели инструментов). Поскольку основы создания дочерних окон рассмотрены в главе 8, здесь мы остановимся на некоторых подробностях: резервирование места в панели инструментов для дочернего окна, изменение размеров панели инструментов, поддержка окон подсказки.
Резервирование места для дочернего окна на панели инструментов
В книге "Programming the Windows 95 User Interface" Nancy Cluts предлагает включать разделители (кнопки стиля TBSTYLE_SEP) для сохранения пустого пространства при создании дочернего окна на панели инструментов. Вам предстоит поэкспериментировать, чтобы определить правильное число разделителей, а пока программа GADGETS, приведенная далее в этой главе, использует 20 разделителей для резервирования места для комбинированного списка.
Присутствие разделителей упрощает расчет координат для окна, которые необходимо задать при вызове функции CreateWindow. Посылается сообщение TB_GETITEMRECT для получения координат в пикселях любого элемента панели инструментов — кнопки или разделителя, и возвращается четыре координаты прямоугольника указанного элемента. Ниже показано, каким образом программа GADGETS вычисляет размеры пространства, доступного для комбинированного списка, используя макрос сообщения из файла COMMCTRL.H (находится на прилагающемся компакт-диске):
RECT r ;
int x, y, cx, cy ;
// Вычисляем координаты для комбинированного списка
ToolBar_GetItemRect ( hwndTB, 0, &r ) ;
x = r.left ;
y = r.top ;
ToolBar_GetItemRect ( hwndTB, 18, &r ) ;
cx = r.right — x + 1 ;
Левый верхний угол элемента управления устанавливается в точку с координатами (x, y), в соответствии с размерами кнопок панели инструментов. Поскольку программа GADGETS использовала 20 разделителей на своей панели инструментов, запрос положения 19-го (или 18 при отсчете с нуля) разделителя, оставляет один разделитель между правым краем комбинированного списка и первой кнопкой.
Другим значением, необходимым для помещения дочернего окна на панель инструментов, является высота, которая для большинства элементов управления будет равна высоте кнопки (r.bottom — r.top + 1), полученной из сообщения TB_GETITEMRECT. Но комбинированный список ведет себя несколько иначе, чем другие типы окон, поскольку его часть редактирования (или статическая) изменяет размер самостоятельно с тем, чтобы прийти в соответствие шрифту, и высота, передаваемая в функцию CreateWindow, есть возможная высота для ниспадающего окна. Установка значения, достаточного для нескольких строк, хороша тогда, когда вы используете для расчета данные о шрифте, получаемые от функции GetTextMetrics. Программа GADGETS этого не делает и устанавливает это значение жестко:
cy = 100 ;