OK, давайте лечить. Метод FindDragTarget вызывается в коде-обработчике подсказки, и позволяет увидеть компонент, находящийся в данный момент под курсорм мыши. FindDragTarget вызывает функцию Windows API WindowFromPoint. И WindowFromPoint *НЕ* возвращает "выключенные" окна. В электронной справке по API говорится, что если вам необходимы также выключенные окна, используйте ChildWindowFromPoint. ОГО! Это идея. Если элемент управления выключен, то будет найдена или сама форма, или же контейнер выключенного компонента. Если компонент, найденый с помощью ChildWindowFromPoint отличается от найденного с помощью WindowFromPoint, мы должны высветить подсказку. Это работает! Но хочу предостеречь: вы не сможете таким образом получить подсказку для самой формы или контейнеров типа TPanel или TGroupBox. Попытайтесь сами!
procedure TForm1.AppShowHint(var HintStr: string;var CanShow: Boolean; var HintInfo: THintInfo);VARPT : TPoint;H : HWnd;TWC : TWinControl;beginIF NOT (HintInfo.HintControl IS TWinControl) THEN Exit;GetCursorPos(PT);PT := HintInfo.HintControl.ScreenToClient(PT);H := ChildWindowFromPoint(TWinControl(HintInfo.HintControl).Handle, PT);TWC := FindControl(H);IF TWC = NIL THEN Exit;IF TWC = Self THEN CanShow := FalseELSE IF TWC = HintInfo.HintControl then exit (эту строку добавил Tim Frost}ELSE IF TWC.ControlCount > 0 THEN CanShow := FalseELSEWITH TWC DOIF ShowHint AND (Hint <> '') THENBEGINHintStr := '(выключен) ' +Hint;HintInfo.HintPos := ClientOrigin;Inc(HintInfo.HintPos.Y, Height + 6);END;end; procedure TForm1.FormCreate(Sender: TObject);beginApplication.OnShowHint := AppShowHint;end; |
- Neil J. Rubenking [000743]