Как реализовать подсказки In-Place
Встроенные подсказки используются для отображения строк текста для объектов, которые были обрезаны. См. иллюстрацию в О подсказках.
Разница между обычными и встроенными подсказками заключается в расположении. По умолчанию при наведении указателя мыши на регион с подсказкой, связанной с ним, подсказка отображается рядом с регионом. Однако подсказки являются окнами, и их можно разместить в любом месте, которое вы выберете, вызвав SetWindowPos. Создание подсказки на месте — это вопрос размещения окна подсказки таким образом, чтобы оно перекрывало текстовую строку.
Что нужно знать
Технологии
Необходимые условия
- C/C++
- Программирование пользовательского интерфейса Windows
Инструкции
Размещение подсказки In-Place
При размещении встроенной подсказки необходимо отслеживать три прямоугольника:
- Прямоугольник, который окружает полный текст метки.
- Прямоугольник, который окружает текст подсказки. Текст подсказки идентичен полному тексту метки и обычно совпадает с размером и шрифтом. Таким образом, два текстовых прямоугольника обычно будут одинаковыми.
- Прямоугольник окна подсказки. Этот прямоугольник несколько больше прямоугольника текста подсказки, который он содержит.
На следующем рисунке показаны три прямоугольника. Скрытая часть текста метки обозначается серым фоном.
Чтобы создать всплывающую подсказку на месте, необходимо разместить прямоугольник текста подсказки так, чтобы он накладывал на прямоугольник текста метки. Процедура выравнивания двух прямоугольников является относительно простой:
- Определите прямоугольник текста метки.
- Поместите окно подсказки так, чтобы прямоугольник текста подсказки наложился на прямоугольник текста метки.
На практике обычно достаточно выровнять левый верхний угол двух прямоугольников текста. Попытка изменить размер прямоугольника подсказки, чтобы точно соответствовать прямоугольнику текста метки, может вызвать проблемы с отображением подсказки.
Проблема с этой простой схемой заключается в том, что невозможно точно расположить прямоугольник с текстом подсказки. Вместо этого необходимо разместить прямоугольник окна подсказки достаточно далеко выше и слева от прямоугольника текста метки, чтобы углы двух текстовых прямоугольников совпадали. Другими словами, необходимо знать смещение между прямоугольником окна подсказки и прямоугольником текста, содержащегося в нем. Как правило, нет простого способа определить это смещение.
Внедрение подсказок In-Place
В следующем фрагменте кода показано, как использовать сообщение TTM_ADJUSTRECT в обработчике TTN_SHOW для отображения встроенной подсказки. Приложение указывает, что текст метки усечен, установив переменной fMyStringIsTruncated значение TRUE. Обработчик вызывает определяемую приложением функцию GetMyItemRect, чтобы получить прямоугольник текста метки. Этот прямоугольник передается в элемент управления подсказки с TTM_ADJUSTRECT, который возвращает соответствующий прямоугольник окна. SetWindowPos затем вызывается для размещения подсказки над меткой.
case TTN_SHOW:
if (fMyStringIsTruncated)
{
RECT rc;
GetMyItemRect(&rc);
SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
Этот пример не изменяет размер подсказки, а только ее положение. Два текстовых прямоугольника выровнены в левом верхнем углу, но не обязательно с одинаковыми измерениями. На практике разница обычно небольшая, и этот подход рекомендуется для большинства целей. Хотя вы можете, в принципе, использовать SetWindowPos, чтобы изменить размер, а также изменить положение подсказки, это может иметь непредсказуемые последствия.
Замечания
Общие элементы управления версии 5.80 упрощают использование встроенных подсказок путем добавления нового сообщения TTM_ADJUSTRECT. Отправьте это сообщение с координатами прямоугольника, в который нужно наложить текст метки, чтобы подсказка наложилась, и оно вернёт координаты соответствующего окна подсказки.
Связанные разделы