Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-12_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
456.7 Кб
Скачать

Поддержка элемента управления подсказка

Элемент управления подсказка — это маленькое окно, содержащее текст подсказки. Обычно, подсказка активизируется, когда курсор мыши оказывается в специфической области кнопки панели инструментов. Однако существует возможность активизировать ее в любое время. Элемент управления подсказка хранит список "горячих" (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) ;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]