Hatte schonmal dasselbe Problem in
Lauge. In der Gallerie sollten je nach anvisierter Fläche unterschiedliche Hints angezeigt werden.
In der
VCL wurden die Hints über die Messages CM_HINTSHOW und CM_HINTSHOWPAUSE realisiert.
Hier ein Auszug aus meinem Code:
Delphi-Quellcode:
TBaseVirtualTilesView = class(TCustomImage32)
private
{**
* Das Rechteck, welches für den letzten Hint als Grenze fungiert
*
* Der Hint wird erst geändert/ausgeblendet, wenn der Cursor diesen Bereich verlässt.
*}
FLastHintCursorRect:TRect;
procedure CMHintShow(var Message:TCMHintShow); message CM_HINTSHOW;
procedure CMHintShowPause(var Message:TCMHintShowPause); message CM_HINTSHOWPAUSE;
end;
implementation
procedure TBaseVirtualTilesView.CMHintShow(var Message:TCMHintShow);
var
HintTile:TVirtualTile; // Ein Hint-Referenzobjekt
MinHintPosY:Integer;
begin
Message.Result:=1; // 1 verhindert und 0 erlaubt die Erstellung des Hints
{**
* Verhindern, dass der Hint bei jeder Mausbewegung ausgeblendet wird
*}
if PtInRect(FLastHintCursorRect, Message.HintInfo.CursorPos) then
Exit;
{**
* Das Referenzobjekt unter dem Mauszeiger ermitteln
*}
HintTile:=GetTileAt(Message.HintInfo.CursorPos.X, Message.HintInfo.CursorPos.Y);
if not (Assigned(HintTile) and HintTile.ShowHint) then
Exit;
FLastHintCursorRect:=MakeRect(HintTile.GetAdjustedRect(HintTile.Location));
Message.HintInfo.CursorRect:=FLastHintCursorRect;
Message.HintInfo.HintWindowClass:=GetHintWindowClass; // Beliebige THintWindow-Klasse
Message.HintInfo.HintStr:='Der Hint-String';
// Beliebiger Pointer: siehe 3. Parameter von THintWindow.ActivateHintData
Message.HintInfo.HintData:=Pointer(HintTile);
Message.HintInfo.HideTimeout:=-1; // -1 = kein Timeout
Message.HintInfo.ReshowTimeout:=0;
Message.HintInfo.HintPos.X:=FLastHintCursorRect.Right;
Message.HintInfo.HintPos.Y:=FLastHintCursorRect.Top;
Message.HintInfo.HintPos:=ClientToScreen(Message.HintInfo.HintPos);
MinHintPosY:=ClientToScreen(Point(0, 0)).Y;
Message.HintInfo.HintPos.Y:=Max(Message.HintInfo.HintPos.Y, MinHintPosY);
Message.Result:=0; // Erstellung erlauben
end;
procedure TBaseVirtualTilesView.CMHintShowPause(var Message:TCMHintShowPause);
begin
Message.Pause^:=500; // Pause in Millisekunden bevor der Hint angezeigt wird
end;
Dieses Listing sollte genügend Informationen enthalten, um sich daraus seine eigene Lösung umzusetzen.
Um an die Messages zu kommen kann man die betreffende Klasse subclassen oder die WndProc hooken.