Как реализовать подсказки на месте

Подсказки на месте используются для отображения текстовых строк для объектов, которые были обрезаны. Иллюстрация см. в разделе "Сведения о элементах управления подсказками".

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

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Размещение подсказки на месте

При расположении подсказки на месте необходимо отслеживать три прямоугольника:

  1. Прямоугольник, который окружает полный текст метки.
  2. Прямоугольник, который окружает текст подсказки. Текст подсказки идентичен полному тексту метки и обычно совпадает с размером и шрифтом. Таким образом, два текстовых прямоугольника обычно будут одинаковыми.
  3. Прямоугольник окна подсказки. Этот прямоугольник несколько больше прямоугольника подсказки, заключаемого в него.

На следующем рисунке показаны три прямоугольника. Скрытая часть текста метки обозначается серым фоном.

diagram showing a long string, half of which has a gray background, then the same string within a larger tooltip window rectangle

Чтобы создать подсказку на месте, необходимо разместить прямоугольник текста подсказки, чтобы он накладывал прямоугольник текста метки. Процедура выравнивания двух прямоугольников является относительно простой:

  1. Определите прямоугольник текста метки.
  2. Поместите окно подсказки таким образом, чтобы прямоугольник подсказки наложит прямоугольник текста метки.

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

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

Реализация подсказок на месте

В следующем фрагменте кода показано, как использовать сообщение 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. Отправьте это сообщение с координатами прямоугольника текста метки, который требуется наложить подсказку, и возвращает координаты соответствующего прямоугольника всплывающей подсказки.

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