
- •Глава 12 Современный пользовательский интерфейс
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Основные стили окна
- •Флаги расширенного стиля окна
- •Флаги основного стиля элемента управления общего пользования
- •Флаги стиля, специфичные для конкретного элемента управления
- •Посылка сообщений элементам управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Стили окна панели инструментов
- •Задание изображений на поверхности кнопок
- •Заполнение массива tbbutton
- •Пример создания панели инструментов
- •Перемещение и изменение размеров панели инструментов
- •Поддержка элемента управления подсказка
- •Добавление дочерних окон в панель инструментов
- •Резервирование места для дочернего окна на панели инструментов
- •Создание элементов управления на панели инструментов
- •Изменение размеров панели инструментов с дочерними окнами
- •Поддержка окон подсказки для дочерних окон панели инструментов
- •Изменение конфигурации панели инструментов
- •Строка состояния
- •Создание строки состояния
- •Перемещение и изменение размеров строки состояния
- •Поддержка просмотра меню
- •Просмотр элементов меню
- •Просмотр элементов всплывающего меню
- •Просмотр системного меню
- •Программа gadgets
Перемещение и изменение размеров строки состояния
Когда родительское окно строки состояния изменяет размер (при получении сообщения WM_SIZE), строка состояния должна занять новое положение и приобрести другие размеры, чтобы остаться в нижней части рабочей области родительского окна. Панель инструментов изменяет размеры в ответ на сообщение TB_AUTOSIZE (см. ранее в этой главе). У строки статуса нет аналогичного сообщения. Вместо него используется примерно следующие:
case WM_SIZE:
{
int cxParent = LOWORD (lParam) ;
int cyParent = HIWORD (lParam) ;
int x, y, cx, cy ;
RECT rWindow ;
// Оставить высоту окна строки состояний без изменений
GetWindowRect (hwndStatusBar, &rWindow) ;
cy = rWindow.bottom — rWindow.top ;
x = 0 ;
y = cyParent — cy ;
cx = cxParent ;
MoveWindow (hwndStatusBar, x, y, cx, cy, TRUE) ;
}
Этот код сохраняет высоту строки состояния без изменений и модифицирует ее ширину и местоположение таким образом, чтобы занять нужное место в рабочей области родительского окна.
Поддержка просмотра меню
Пользователи ожидают от Windows — программ отображения вспомогательной информации в строке состояния о том, какую функцию выполняет тот или иной пункт меню. Даже случайный пользователь Windows быстро учится тому, что под пунктом меню из одного слова скрывается значительно более широкое действие. И хотя опытные пользователи легко понимают смысл стандартных команд меню, иногда им приходится тратить много сил, чтобы понять смысл специфичных пунктов меню конкретной программы.
Меню окна посылает сообщение WM_MENUSELECT, когда пользователь просматривает пункты меню, и сообщение WM_COMMAND, когда пользователь выбирает пункт меню (см. главу 10). Для поддержки отображения вспомогательной информации о пунктах меню следует обрабатывать сообщение WM_MENUSELECT.
Для упрощения процесса обработки этого сообщения и отображения текста в строке состояния библиотекой элементов управления общего пользования поддерживается функция MenuHelp. Эта функция предполагает наличие таблицы строк, содержащей тексты вспомогательной информации для отображения, и структуры данных, связывающей пункты меню с идентификаторами текстовых строк из таблицы. Функция MenuHelp определена следующим образом:
void MenuHelp (UINT uMsg, // WM_MENUSELECT
WPARAM wParam, // параметр wParam
LPARAM lParam, // параметр lParam
HMENU hMainMenu, // описатель главного меню
HINSTANCE hInst, // описатель экземпляра
HWND hwndStatus, // описатель окна строки состояния
UINT FAR *lpwIDs) ; // таблица строк
Первый параметр, uMsg, должен быть равен WM_MENUSELECT, хотя наличие этого параметра (и его описание в документации по Win32) говорит о том, что обработка сообщения WM_COMMAND была заложена еще при разработке функции. В качестве второго и третьего параметров передаются параметры wParam и lParam оконной процедуры. Эти три параметра, взятые вместе, описывают то, какую часть системы меню просматривает пользователь, и является ли он пунктом, всплывающего меню или системного.
Шестой параметр, hwndStatus, это описатель окна строки состояния. Функция MenuHelp посылает специфичное для строки состояния сообщение SB_SIMPLE для установки строки состояния в режим одного окна (простой) и для отображения соответствующего текста. Позднее, когда пользователь прекращает просмотр, функция MenuHelp посылает другое сообщение SB_SIMPLE для возврата строки состояния в режим многих окон (непростой).
Функция MenuHelp использует другие три параметра — hMainMenu, hInst и lpwIDs — для определения того, какую строку необходимо отобразить при просмотре элемента меню. Параметр hInst идентифицирует модуль, который может быть описателем экземпляра DLL или описателем экземпляра выполняемой программы, и является владельцем таблицы, содержащей строки меню (которые, как можно предположить, загружаются с помощью функции LoadString).
Возможность сделать так, чтобы функция MenuHelp работала правильно, состоит в том, чтобы передать правильное значение в четвертом и седьмом параметрах: hMainMenu и lpwIDs. Правильная установка этих значений является небольшим трюкачеством, поскольку существует три элемента для рассмотрения: командное меню, всплывающее меню и системное меню. Другая сложность состоит в том, что документация по Win32 говорит о том, что lpwIDs — массив, в котором осуществляет поиск функция MenuHelp. Несмотря на то, что имеет смысл использовать массив для хранения базовых значений строковых ресурсов, вы должны будете сами делать грамматический разбор массива, поскольку функция MenuHelp не делает этого.