好像不太可能.至少在VCL内部的体制下.
我们来看一看hint的处理过程.
在每一个TControl的消息处理时,对TWMMouseMove都有一个处理,
去调用Application.HintMouseMove,在HintMouseMove里判断是否
应该去出现一个新的hint window;
procedure TApplication.HintMouseMessage(Control: TControl; var
Message: TMessage);
var
NewHintControl: TControl;
Pause: Integer;
WasHintActive: Boolean;
begin
NewHintControl := GetHintControl(FindDragTarget(Control.ClientToScreen(SmallPointToPoint
(TWMMouse(Message).Pos)), True));
//这一句试图得出当前的拥有hint权的Control;
if (NewHintControl = nil) or not NewHintControl.ShowHint then
CancelHint
//若showhint被封锁,就把原来可能有的hint窗口关掉;
else
begin
if (NewHintControl <> FHintControl) or
(not PtInRect(FHintCursorRect,
Control.ClientToScreen(SmallPointToPoint(TWMMouse(Message).Pos))))
then
// 关键就在这个条件判断上: 它的判断条件是鼠标是不是在FHintCursorRect
//的内部.而为了节省时间,delphi是在显示hint窗口( 在activateHint函数中)的
//时候置FHintCursorRect为当前HintControl的Rect;
//而如果在当前的image上已经有hint出现了,就不会出现满足条件的情况!
begin
//下面是处理出现一个新的hint window;
WasHintActive := FHintActive;
if WasHintActive then
Pause := FHintShortPause else
Pause := FHintPause;
CancelHint;
FHintActive := WasHintActive;
FHintControl := NewHintControl;
StartHintTimer(Pause, tmShow);
end;
end;
end;
一个很显然的想法是能不能自己改FHintCursorRect,但这是Tapplication
私有的,并且ActivateHint, HintMouseMessage, CancelHint,都是这样.
只要cancelRect或HintMouseMessage中的一个能override,事情就都好办.
可惜好像不能.
而且,只要沿用这个体系来处理hint,在一个control内永远不能动态更改
hint.
要是有什么UpdateHint就好了,可惜和ActivateHint有关的属性全都是
私有的.
除非你全部抛弃这样的体制,自己画hintwindow,不然....
去找找控件吧,因该有人早做好了.这可实在是很需要的效果.