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

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

Элемент управления подсказки на следующем рисунке отображает сведения о файле на рабочем столе Windows. При перемещении мыши на иллюстрацию вы также увидите динамическую подсказку, содержащую описательный текст.

screen shot showing text in a tooltip that appears over a file on the desktop

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

Поведение и внешний вид подсказки

Элементы управления подсказками могут отображать одну строку текста или несколько строк. Их углы могут быть округленными или квадратными. Они могут или не иметь стебля, который указывает на инструменты, как мультипликационный речевой шар. Текст подсказки может быть стационарным или может перемещаться с указателем мыши, который называется отслеживанием. Неустанный текст может отображаться рядом с инструментом или его можно отобразить над инструментом, который называется на месте. Стандартные подсказки являются стационарными, отображают одну строку текста, имеют квадратные угла и не указывают на инструмент.

Подсказки отслеживания, поддерживаемые 4.70 распространенных элементов управления, динамически изменяют положение на экране. Быстро обновляя позицию, эти элементы управления подсказки отображаются для плавного перемещения или "отслеживания". Это полезно, если вы хотите, чтобы текст подсказки следует за положением указателя мыши при перемещении. Дополнительные сведения о подсказках отслеживания и примере кода, демонстрирующего их создание, см. в разделе "Подсказки отслеживания".

Подсказки с несколькими линиями, которые также поддерживаются 4.70 общих элементов управления, отображают текст в нескольких строках. Это полезно для отображения длинных сообщений. Дополнительные сведения и пример создания многострочного подсказки см. в разделе "Многострочный подсказки".

Всплывающие подсказки отображаются в коробке с округленными углами и стеблем, указывающим на инструмент. Они могут быть однострочные или многострочные. На следующем рисунке показана подсказка воздушных шаров со стеблем и прямоугольником в их позициях по умолчанию. Дополнительные сведения о подсказках воздушных шаров и примере, где показано, как их создать, см. в разделе "Использование элементов управления подсказками".

screen shot showing a tooltip containing one line of text, positioned above a button on a dialog box

Подсказка также может содержать текст заголовка и значок, как показано на следующем рисунке. Обратите внимание, что подсказка должна содержать текст; Если он содержит только текст заголовка, подсказка не отображается. Кроме того, значок не отображается, если нет заголовка.

screen shot showing a tooltip with an icon, title, and text, positioned below a button on a dialog box

Иногда текстовые строки обрезаются, так как они слишком длинны для отображения полностью в небольшом окне. Подсказки на месте используются для отображения текстовых строк для объектов, которые были обрезаны, например имя файла на следующем рисунке. Пример создания подсказок на месте см . в подсказках на месте.

screen shot showing a tooltip containing a file name positioned next to a file icon in a tree control

Курсор должен навести указатель мыши на инструмент в течение определенного периода времени перед отображением подсказки. Длительность этого времени ожидания по умолчанию управляется временем двойного щелчка пользователя и обычно составляет около половины секунды. Чтобы указать значение времени ожидания, отличное от по умолчанию, отправьте элемент управления подсказкой TTM_SETDELAYTIME сообщение.

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

Чтобы создать элемент управления подсказкой, вызовите CreateWindowEx и укажите класс окна TOOLTIPS_CLASS . Этот класс регистрируется при загрузке библиотеки DLL общего элемента управления. Чтобы убедиться, что эта библиотека DLL загружена, включите функцию InitCommonControlsEx в приложение. Необходимо явно определить элемент управления подсказкой как самый верхний. В противном случае он может быть охвачен родительским окном. В следующем фрагменте кода показано, как создать элемент управления подсказкой.

HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
                            WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            CW_USEDEFAULT, CW_USEDEFAULT,
                            hwndParent, NULL, hinstMyDll,
                            NULL);

SetWindowPos(hwndTip, HWND_TOPMOST,0, 0, 0, 0,
             SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

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

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

Элемент управления подсказками может быть активным или неактивным. Если он активен, текст подсказки появляется, когда указатель мыши находится на инструменте. Если он неактивен, текст подсказки не отображается, даже если указатель находится на инструменте. Сообщение TTM_ACTIVATE активирует и деактивирует элемент управления подсказкой.

Вспомогательные инструменты

Элемент управления подсказками может поддерживать любое количество инструментов. Чтобы поддерживать определенное средство, необходимо зарегистрировать средство с помощью элемента управления подсказки, отправив элемент управления TTM_ADDTOOL сообщение. Сообщение содержит адрес структуры TOOLINFO , которая предоставляет сведения, необходимые элементу управления подсказки для отображения текста для инструмента. Элемент uID структуры TOOLINFO определяется приложением. При каждом добавлении средства приложение предоставляет уникальный идентификатор. Требуется элемент cbSize структуры TOOLINFO и должен указать размер структуры.

Элемент управления подсказкой поддерживает средства, реализованные как окна (например, дочерние окна или окна управления), а также прямоугольные области в клиентской области окна. При добавлении инструмента, реализованного в виде прямоугольной области, элемент hwnd структуры TOOLINFO должен указать дескриптор окна, содержащего область, и элемент прямоугольника должен указать координаты клиента ограничивающего прямоугольника области. Кроме того, член uID должен указать идентификатор, определенный приложением для средства.

При добавлении инструмента, реализованного в виде окна, элемент UID структуры TOOLINFO должен содержать дескриптор окна в инструмент. Кроме того, элемент uFlags должен указать значение TTF_IDISHWND , которое сообщает элементу управления подсказки интерпретировать элемент uID как дескриптор окна.

Отображение текста

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

Если слово с высоким порядком lpszText равно нулю, слово с низким порядком должно быть идентификатором строкового ресурса. Если элементу управления подсказки требуется текст, система загружает указанный строковый ресурс из экземпляра приложения, определяемого элементом структуры TOOLINFO.

Если указать значение LPSTR_TEXTCALLBACK в элементе lpszText, элемент управления подсказки уведомляет окно, указанное в элементе структуры TOOLINFO, когда элемент управления подсказки должен отображать текст для инструмента. Элемент управления подсказки отправляет код уведомления TTN_GETDISPINFO в окно. Сообщение содержит адрес структуры NMTTDISPINFO , которая содержит дескриптор окна, а также идентификатор, определенный приложением для средства. Окно проверяет структуру, чтобы определить инструмент, для которого требуется текст, и заполняет соответствующие элементы структуры сведениями, необходимыми элементу управления подсказки для отображения строки.

Примечание.

Максимальная длина стандартного текста подсказки составляет 80 символов. Дополнительные сведения см. в структуре NMTTDISPINFO. Многострочного текста подсказки может быть длиннее.

 

Многие приложения создают панели инструментов, содержащие инструменты, соответствующие командам меню. Для таких инструментов удобно отображать тот же текст, что и соответствующий элемент меню. Система автоматически удаляет символы акселератора амперсанда (&) из всех строк, передаваемых в элемент управления подсказкой, и завершает строку на первом символе табуляции (\t), если только элемент управления не имеет стиля TTS_NOPREFIX.

Чтобы получить текст для средства, используйте сообщение TTM_GETTEXT .

Обмен сообщениями и уведомлением

Текст подсказки обычно отображается при наведении указателя мыши на область, обычно прямоугольник, определенный средством, например элементом управления кнопкой. Однако Microsoft Windows отправляет только сообщения, связанные с мышью, в окно, содержащее указатель, а не сам элемент управления подсказки. Сведения, связанные с мышью, должны быть переданы в элемент управления подсказки, чтобы он отображал текст подсказки в соответствующее время и место.

Вы можете автоматически передавать сообщения, если:

  • Это средство является элементом управления или определяется как прямоугольник в структуре TOOLINFO средства.
  • Окно, связанное с инструментом, находится в том же потоке, что и элемент управления подсказки.

Если эти два условия выполнены, задайте флаг TTF_SUBCLASS в элементе uFlags структуры TOOLINFO средства при добавлении средства в элемент управления подсказки с TTM_ADDTOOL. Затем необходимые сообщения мыши будут автоматически передаваться в элемент управления подсказкой.

Установка TTF_SUBCLASS для передачи сообщений мыши в элемент управления достаточно для большинства целей. Однако он не будет работать в тех случаях, когда нет прямого подключения между элементом управления подсказкой и окном инструмента. Например, если средство реализуется как прямоугольная область в окне, определяемом приложением, процедура окна получает сообщения мыши. Настройка TTF_SUBCLASS достаточно, чтобы убедиться, что они передаются в элемент управления. Однако если средство реализуется как системное окно, сообщения мыши отправляются в это окно и не доступны напрямую приложению. В этом случае необходимо либо подклассить окно, либо использовать перехватчик сообщения для доступа к сообщениям мыши. Затем необходимо явно ретранслировать сообщения мыши в элемент управления подсказки с помощью TTM_RELAYEVENT. Пример использования TTM_RELAYEVENT см. в подсказках отслеживания.

Когда элемент управления подсказки получает сообщение WM_MOUSEMOVE , он определяет, находится ли указатель мыши в ограничивающем прямоугольнике инструмента. Если это так, элемент управления подсказки задает таймер. В конце интервала времени ожидания элемент управления подсказки проверка положение указателя, чтобы узнать, перемещен ли он. Если это не так, элемент управления подсказки извлекает текст для инструмента и отображает подсказку. Элемент управления подсказки продолжает отображать окно, пока оно не получит сообщение с ретрансляторной кнопкой вверх или кнопкой вниз или пока сообщение WM_MOUSEMOVE указывает, что указатель перемещен за пределы ограничивающего прямоугольника средства.

Элемент управления подсказки фактически имеет три времени ожидания, связанные с ним. Начальная длительность — это время, когда указатель мыши должен оставаться в ограничивающем прямоугольнике инструмента перед отображением окна подсказки. Длительность повторного отображения — это длина задержки, прежде чем последующие окна подсказки отображаются при переходе указателя с одного средства на другое. Длительность всплывающего окна — это время, когда окно подсказки по-прежнему отображается до его скрытия. То есть, если указатель остается стационарным в ограничивающем прямоугольнике после отображения окна подсказки, окно подсказки автоматически скрывается в конце всплывающего окна. Все сроки ожидания можно настроить с помощью сообщения TTM_SETDELAYTIME.

Если приложение включает средство, реализованное в виде прямоугольной области, а также размер или положение элемента управления, приложение может использовать сообщение TTM_NEWTOOLRECT , чтобы сообщить об изменении элемента управления подсказки. Приложению не нужно сообщать об изменениях размера и положения для инструмента, реализованного в виде окна, так как элемент управления подсказки использует дескриптор окна средства для определения того, находится ли указатель мыши на инструменте, а не ограничивающий прямоугольник средства.

Когда подсказка будет отображаться, элемент управления подсказки отправляет окно владельца TTN_SHOW код уведомления. Окно владельца получает код уведомления TTN_POP при скрытии подсказки. Каждый код уведомления отправляется в контексте сообщения WM_NOTIFY .

Проверка нажатия

Сообщение TTM_HITTEST позволяет получить сведения о том, что элемент управления подсказки содержит сведения о инструменте, занимающего определенную точку. Сообщение содержит структуру TTHITTESTINFO, содержащую дескриптор окна, координаты точки и адрес структуры TOOLINFO. Элемент управления подсказки определяет, занимает ли инструмент точку и, если это делает, заполняет TOOLINFO сведениями о инструменте.

Обработка сообщений по умолчанию

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

Message Description
WM_CREATE Гарантирует, что элемент управления подсказки содержит стили WS_EX_TOOLWINDOW и WS_POPUP окон. Он также выделяет память и инициализирует внутренние переменные.
WM_DESTROY Освобождает ресурсы, выделенные для элемента управления подсказками.
WM_GETFONT Возвращает дескриптор шрифта, который элемент управления подсказки будет использовать для рисования текста.
WM_MOUSEMOVE Скрывает окно подсказки.
WM_PAINT Рисует окно подсказки.
WM_SETFONT Задает дескриптор шрифта, который элемент управления подсказки будет использовать для рисования текста.
WM_TIMER Скрывает окно подсказки, если средство изменило положение или указатель мыши перемещен за пределы инструмента. В противном случае отображается окно подсказки.
WM_WININICHANGE Сбрасывает внутренние переменные, основанные на системных метриках.