Volcano software logo
Главная
 
Программы
 
Модули
 
Статьи
 
программы
Tile Manager
Time Control
поиск по сайту

Создание всплывающих подсказок средствами WinApi


Создание элемента управления ToolTip
Подключение инструментов
Многострочные всплывающие подсказки
Перемещающиеся (tracking) всплывающие подсказки
Подсказки в виде "воздушных шариков"
Другие возможности
Структуры
Стили
Сообщения
Демонстрация использования ToolTip

Редкая оконная программа обходится без использования всплывающих подсказок. Подсказки в основном применяются для того, что бы предоставить пользователю дополнительную информацию о каком-либо элементе окна (например, кнопке панели инструментов, панели строки состояния и т.п.) или о какой-либо части элемента окна (например, строке в ListView/TreeView). Подсказки появляются, когда пользователь задерживает курсор на элементе, с которым связанна подсказка. В этой статье мы рассмотрим методы создания и управления различными видами всплывающих подсказок.

Для реализации всплывающих подсказок предназначен элемент управления ToolTip. Этот элемент входит в состав общих элементов управления, которые содержатся в трех DLL: Comctl32.dll, Shell32.dll и Shlwapi.dll. Некоторые возможности ToolTip зависят от версии этих DLL, например, всплывающие подсказки в виде "воздушного шарика", доступны с версии 5.80. Узнать номер текущей версии можно с помощью функции DllGetVersion.

Создание элемента управления ToolTip

Прежде чем начать использовать ToolTip, Вы должны быть уверены, что загружена DLL с общими элементами управления:

var
  ICCEx: TInitCommonControlsEx;
begin

  ICCEx.dwICC := ICC_WIN95_CLASSES;
  ICCEx.dwSize := sizeof(TInitCommonControlsEx);
  InitCommonControlsEx(ICCEx);
  
  ...

Поскольку ToolTip представляет собой обыкновенное окно, то для его создания используется функция CreateWindowEx. Для окна ToolTip всегда установлены стили WS_POPUP и WS_EX_TOOLWINDOW, независимо от того, укажите Вы их при создании или нет. Не забудьте указать флаг WS_EX_TOPMOST, иначе всплывающая подсказка может быть перекрыта родительским окном.

var
  hToolTip: HWND;
begin
  hToolTip := CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, nil,
      TTS_ALWAYSTIP,
      integer(CW_USEDEFAULT), integer(CW_USEDEFAULT),
      integer(CW_USEDEFAULT), integer(CW_USEDEFAULT),
      hParent, 0, hInstance, nil );

  ...

hParent в данном примере - это указатель на родительское окно. Флаг TTS_ALWAYSTIP означает, что подсказка всегда будет выводится, независимо от того, активно родительское окно или нет. Этот и другие флаги, начинающиеся с TTS_ определяют стиль всплывающей подсказки.

После создания элемента управления ToolTip, Вы можете управлять им, посылая соответствующие сообщения.

Подключение инструментов

ToolTip может поддерживать любое количество инструментов, т.е. оконных элементов, для которых нужна всплывающая подсказка. Для этого нужно послать ToolTip сообщение TTM_ADDTOOL, передав в качестве параметра адрес структуры TOOLINFO:

var
  TI: TOOLINFO;
begin

  {  Инициализируем структуру ToolInfo  }
  TI.cbSize := SizeOf(TOOLINFO);
  TI.uFlags := TTF_SUBCLASS;
  TI.uId := 0;
  TI.hwnd := btnTest.Handle;
  TI.lpszText := 'Tooltip message';
  Windows.GetClientRect(btnTest.Handle, TI.Rect);  
  
  SendMessage(hToolTip, TTM_ADDTOOL, 0, LPARAM(@ti));
  ...

В этом примере мы определили всплывающую подсказку для кнопки btnTest. Элемент структуры TOOLINFO Rect определяет для какой области кнопки будет появлятся подсказка (в примере - это вся область кнопки), элемент uID, в данном случае, это уникальный в пределах приложения идентификатор инструмента. Флаг TTF_SUBCLASS означает, что ToolTop сам обрабатывает сообщения мыши, если же вместо него указать флаг TTF_IDISHWND, то uID должен представлять указатель на инструмент (т.е. кнопку btnTest), а элемент hwnd - указатель на родительское окно, областью вывода подсказки, в этом случае, будет вся область кнопки.

Перемещающиеся (tracking) всплывающие подсказки

Перемещающиеся подсказки динамически меняют свое положение на экране. Для того, что бы создать перемещающуюся подсказку, добавьте флаг TTF_TRACK в элемент uFlags структуры TOOLINFO.

Что бы активировать (или деактивировать) созданную перемещающуюся подсказку, Вам нужно послать сообщение TTM_TRACKACTIVATE. Активация/деактивация влияет также, на то будет или нет показываться всплывающая подсказка. Когда подсказка активирована, Ваше приложение должно указать позицию для ее вывода. Что бы сделать это, пошлите элементу управления ToolTip сообщение TTM_TRACKPOSITION. Так как приложение само обрабатывает задачу позиционирования подсказки, то перемещающиеся подсказки не используют флаг TTF_SUBCLASS или сообщение TTM_RELAYEVENT.

  ...
  {  Инициализируем структуру ToolInfo  }
  TI.cbSize := SizeOf(TOOLINFO);
  TI.uFlags := TTF_IDISHWND OR TTF_TRACK OR TTF_ABSOLUTE;
  TI.hwnd := hParent;
  TI.uId := btnTest.Handle;
  TI.lpszText := 'Tracking Tooltip message';

  SendMessage(hToolTip, TTM_ADDTOOL, 0, LPARAM(@ti));
  SendMessage(hToolTip, TTM_TRACKACTIVATE, 
      WPARAM(TRUE), LPARAM(@ti));
  
  ...

В приведенном ниже обработчике перемещения курсора мыши, мы посылаем элементу управления ToolTip сообщение TTM_TRACKPOSITION, передавая координаты мыши со смещеним вправо и вниз на 15 пикселей:

procedure TFormMain.btnTestMouseMove(Sender: TObject; 
    Shift: TShiftState; X, Y: Integer);
var
  Rect: TRect;
begin

    Windows.GetWindowRect( btnTest.Handle, Rect);
    SendMessage(TTTracking, TTM_TRACKPOSITION, 0,
        MAKELPARAM(Rect.Left + x + 15,
                   Rect.Top + y + 15));
end;

Что бы всплывающая подсказка исчезала в момент выхода курсора мыши за пределы кнопки, можно отслеживать положение указателя мыши: если курсор попал в пределы области инструмента, то послать ToolTip сообщение TTM_TRACKACTIVATE с параметром TRUE, а если вышел из этой области - с параметром FALSE.

Многострочные всплывающие подсказки

Многострочные всплывающие подсказки позволяют показывать текст, размещенный на нескольких строках. Что бы заставить ToolTip использовать многострочность, пошлите сообщение TTM_SETMAXTIPWIDTH, указав ширину выводимой подсказки. Если текст выходит за пределы указанной величины, то он будет перенесен на другую строку. Высота подсказки будет увеличена, что бы вместить новую строку. Вы также можете использовать символы #13#10 для переноса строки.

const
  sText = 'Это длинный текст для ToolTip, который '+
    'автоматически будет разбит на несколько строк, '+
    'чтобы не превысить максимальную 'ширину.'#13#10+
    'Вместо этого вы можете использовать '+
    'последовательность символов #13#10 '+
    'для того, чтобы начать новую строку.';
  ...
  SendMessage(hToolTip, TTM_ADDTOOL, 0, LPARAM(@ti));
  SendMessage(hToolTip, TTM_SETMAXTIPWIDTH, 0, 350);
  ...  

Подсказки в виде "воздушных шариков"

Подсказки в виде "воздушных шариков" (таких как в комиксах, когда нужно показать текст, который персонаж произносит) отличаются от обычных закругленными краями и указателем, направленным на инструмент. Создание "воздушных шариков" практически не отличается от создания обычных подсказок, они также могут быть одно- или многострочные, перемещаемыми или нет.

Для того, что бы подсказки выводились в виде "воздушных шариков", укажите стиль TTS_BALLOON при создании элемента управления ToolTip (константа TTS_BALLOON в Delphi не определена, по крайней мере до седьмой версии):

const
  TTS_BALLOON = $40;
  ...
  hToolTip := CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, nil,
      TTS_ALWAYSTIP OR TTS_BALLOON,
      integer(CW_USEDEFAULT), integer(CW_USEDEFAULT),
      integer(CW_USEDEFAULT), integer(CW_USEDEFAULT),
      Handle, 0, hInstance, nil );
  ...

Указатель "воздушного шарика" в обычном случае направлен в ту же точку, в которую указывал курсор мыши перед появлением подсказки. Если Вы укажите флаг TTF_CENTERTIP при заполнении элемента uFlags структуры TOOLINFO, то указатель будет направлен в центр инструмента, а сама подсказка будет находится под инструментом.

Вы можете изменить позицию, в которую указывает "воздушный шарик", так же, как описано в разделе о перемещающихся всплывающих подсказках, то есть, указав флаг TTF_TRACK при заполнении структуры TOOLINFO и послав сообщение TTM_TRACKPOSITION с новыми координатами в качестве параметра.

Другие возможности

Посылая элементу управления ToolTip соответствующие сообщения, Вы сможете изменять цвет текста и фона, время задержки при показе всплывающей подсказки, добавить заголовок с иконкой.

Демонстрация использования ToolTip

Вы можете скачать пример, в котором продемонстрированно все вышеперечисленное. Пример написан на Delphi 7.

Автор:

Copyright © 2004
Hosted by uCoz