Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Общие вопросы > Сложная логика показа хинта для компонента


Автор: --Ins-- 13.07.09, 09:24
VCL-компоненты предоставляют набор свойств для отображения всплывающей подсказки (хинта) при наведении мыши на компонент. Это такие свойства как Hint, ShowHint, ParentShowHint. Проблема в том, что только с помощью них гибко управлять показом подсказки достаточно трудно, так как текст хинта един для всего компонента, а область показа равна области самого компонента. Если нужно, чтобы в собственном компоненте показ хинта и его текст зависел от конкретного положения курсора мыши, можно поступить следующим образом - обрабатывать недокументированное сообщение VCL-контролов CM_HINTSHOW. Параметром обработчику этого сообщения передается указатель на структуру THintInfo:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    THintInfo = record
      HintControl: TControl;
      HintWindowClass: THintWindowClass;
      HintPos: TPoint;
      HintMaxWidth: Integer;
      HintColor: TColor;
      CursorRect: TRect;
      CursorPos: TPoint;
      ReshowTimeout: Integer;
      HideTimeout: Integer;
      HintStr: string;
      HintData: Pointer;
    end;

В обработчике сообщения можно подменить ряд параметров, таких как HintStr - собственно сама строка в окне подсказки, или CursorRect - область, при выходе курсора за границы которой подсказка исчезнет и запрос на ее показ при остановке курсора мыши поступит заново.
Подсказка не отображается, если обработчик вернет результатом не ноль.
Примерный код обработчика сообщения может быть таким:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TSomeClass.CMHintShow(var Message: TCMHintShow);
    var
      Pt: TPoint;
    begin
      Message.Result := 1;
      Pt := Message.HintInfo^.CursorPos;
      if <условие> then begin
        Message.HintInfo^.CursorRect := ...;
        Message.HintInfo^.HintStr := ...;
        Message.Result := 0;
      end;
    end;

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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)