Einzelnen Beitrag anzeigen

WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Hint / Tooltip selber anzeigen lassen?

  Alt 3. Mai 2011, 21:11
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.
Waldemar Derr

Geändert von WladiD ( 3. Mai 2011 um 21:14 Uhr)
  Mit Zitat antworten Zitat