
- •Глава 12 Современный пользовательский интерфейс
- •Основы элементов управления общего пользования
- •Инициализация библиотеки
- •Создание элементов управления общего пользования
- •Стили элементов управления общего пользования
- •Основные стили окна
- •Флаги расширенного стиля окна
- •Флаги основного стиля элемента управления общего пользования
- •Флаги стиля, специфичные для конкретного элемента управления
- •Посылка сообщений элементам управления общего пользования
- •Уведомляющие сообщения от элементов управления общего пользования
- •Элементы управления главного окна
- •Панели инструментов
- •Создание панели инструментов
- •Стили окна панели инструментов
- •Задание изображений на поверхности кнопок
- •Заполнение массива tbbutton
- •Пример создания панели инструментов
- •Перемещение и изменение размеров панели инструментов
- •Поддержка элемента управления подсказка
- •Добавление дочерних окон в панель инструментов
- •Резервирование места для дочернего окна на панели инструментов
- •Создание элементов управления на панели инструментов
- •Изменение размеров панели инструментов с дочерними окнами
- •Поддержка окон подсказки для дочерних окон панели инструментов
- •Изменение конфигурации панели инструментов
- •Строка состояния
- •Создание строки состояния
- •Перемещение и изменение размеров строки состояния
- •Поддержка просмотра меню
- •Просмотр элементов меню
- •Просмотр элементов всплывающего меню
- •Просмотр системного меню
- •Программа gadgets
Поддержка элемента управления подсказка
Элемент управления подсказка — это маленькое окно, содержащее текст подсказки. Обычно, подсказка активизируется, когда курсор мыши оказывается в специфической области кнопки панели инструментов. Однако существует возможность активизировать ее в любое время. Элемент управления подсказка хранит список "горячих" (hot) областей, которые в контексте окон подсказки называются инструментами (tool), и которые могут быть или прямоугольными областями в окне, или окнами целиком. Окна подсказки могут появляться у инструментов, расположенных в окне любого типа, хотя мы рассмотрим их в связи с панелью инструментов.
Панели инструментов, построенные с флагом TBSTYLE_TOOLTIPS, имеют элемент управления подсказка. Каждая кнопка, добавляемая в панель инструментов, регистрирует инструмент подсказки. Для модификации подсказки панели инструментов, например для добавления комбинированного списка в список инструментов, необходимо получить описатель окна подсказки путем посылки сообщения TB_GETTOOLTIPS панели инструментов. Затем вы модифицируете окно подсказки путем посылки сообщений (имеющих префикс TTM_) непосредственно элементу управления — подсказке.
Когда подсказка становится активной, она делает запрос текста для отображения путем посылки сообщения WM_NOTIFY с кодом уведомления TTN_NEEDTEXT. Панель инструментов передает это сообщение своему родительскому окну, которое реагирует заполнением структуры TOOLTIPTEXT. Ниже приведен пример того, как необходимо обрабатывать этот запрос в случае, если панель инструментов состоит из трех кнопок и комбинированного списка:
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam ;
LPSTR pReply ;
// получить текст подсказки
if (pnmh->code == TTN_NEEDTEXT)
{
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam;
switch ( lpttt->hdr.idFrom )
{
case 0 :
pReply = "First Button" ;
break;
case 1 :
pReply = "Second Button" ;
break;
case 2 :
pReply = "Third Button" ;
break;
default :
if ((lpttt->uFlags & TTF_IDISHWND) &&
(lpttt->hdr.idFrom == (UINT) hwndCombo))
{
pReply = "Combo box" ;
}
else
{
pReply = "Unknown" ;
}
}
lstrcpy (lpttt->szText, pReply) ;
}
}
Одно странное свойство этого фрагмента кода состоит в том, что параметр lParam сообщения WM_NOTIFY преобразуется к двум различным типам указателя: к указателю на NMHDR и к указателю на TOOLTIPTEXT. Это объясняется тем фактом, что все сообщения WM_NOTIFY передают структуру типа NMHDR, содержащую детали, относящиеся к каждому типу элемента управления общего пользования. Структура типа TOOLTIPTEXT содержит структуру типа NMHDR как первый член данных.
В файле WINUSER.H структура NMHDR определена так:
typedef struct tagNMHDR
{
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR ;
typedef NMHDR FAR *LPNMHDR ;
Третий член этой структуры code содержит код уведомления, т. е. причины, по которой было послано сообщение WM_NOTIFY. Он может принимать значение одного из основных кодов уведомления (таких как NM_CLICK или NM_SETFOCUS) или специфичного кода уведомления для конкретного класса элемента управления (такого как TTN_NEEDTEXT в данном примере). Поле hwndFrom идентифицирует окно, пославшее сообщение, idFrom — или идентификатор окна, или идентификатор конкретного элемента (такого как кнопка панели инструментов) от имени которого было послано сообщение.
Когда подсказка посылает уведомление TTN_NEEDTEXT, она передает указатель на структуру данных, уникальную для этого кода уведомления: TOOLTIPTEXT. Эта структура определена в файле COMMCTRL.H следующим образом:
typedef struct tagTOOLTIPTEXTA
{
NMHDR hdr ;
LPSTR lpszText ;
char szText [80] ;
HINSTANCE hInst ;
UINT uFlags ;
} TOOLTIPTEXTA, FAR *LPTOOLTIPTEXTA ;
Первый член структуры, hdr, содержит данные типа NMHDR, которые должны сопровождать любое сообщение WM_NOTIFY.
При получении сообщения TTN_NEEDTEXT первая задача — проверить, какая кнопка (или окно) была выбрана. Это осуществляется путем проверки поля idFrom структуры NMHDR, которое может быть либо индексом кнопки, если мышь над кнопкой, либо описателем окна, если мышь над дочерним окном панели инструментов. Поле uFlags содержит флаг TTF_IDISHWND для индикации того, что это описатель окна, а не индекс кнопки.
При получении уведомления TTN_NEEDTEXT существует три пути для передачи текста в подсказку: путем передачи указателя на строку в поле lpszText, путем копирования строки в буфер szText или путем задания идентификатора строки-ресурса. Так же как и при работе с другими ресурсами, строка-ресурс задается с помощью описателя экземпляра и уникального идентификатора. Описатель экземпляра копируется в поле hinst, а идентификатор — в поле lpszText, используя макрос MAKEINTRESOURCE:
lpttt->hinst = hInstance ;
lpttt->lpszText = MAKEINTRESOURCE (100) ;