Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: wie transparentes hint? auch verallgemeinerbar?

  Alt 23. Okt 2007, 15:38
Wenn du den Standard-Hint veränderst, gilt dieser für alle Komponenten der VCL, da Tapplication immer nur diesen einen startet. Normalerweise ist dies THintwindow. Du kannst aber auch jederzeit eine andere Klasse als Standard-Hint "registrieren"/angeben. Das THintwindow lässt sich mit sauberer OOP nicht wirklich mehr verändern. Es scheint dafür nicht ausgelegt wurden zu sein. Zum ändern der Transparenz über die WinApi hilft uns auch kein Ereignis (TApplicationEvents.OnShowHint), da die VCL unsere Änderungen gleich wieder zurücksetzt.
Folgende Möglichkeit ist ausreichend kurz:
Delphi-Quellcode:
type TmyHint=class(THintwindow)
       procedure ActivateHint(Rect: TRect; const AHint: string); override;
end;

procedure TmyHint.ActivateHint(Rect: TRect; const AHint: string);
var style:cardinal;
begin
  inherited ActivateHint(rect,aHint); //hier lassen wir erstmal die VCL werkeln
  
  //und jetzt machen wir das Ding noch transparent
  style:=GetWindowLong(Handle,GWL_ExStyle);
  SetWindowLong(Handle,GWL_EXSTYLE,style or WS_EX_LAYERED); //hier noch etwas am Ex-Style ergänzen

  SetLayeredWindowAttributes(Handle,Color,100,LWA_ALPHA); //alphablendvalue:=100
end;
so, und dann noch TmyHint als Standard-Hint angeben:
Hintwindowclass:=TmyHint; Dummerweise macht dieses ActiveHint auch noch eine Animation, die kann man nur damit ausschalten (unter D7, könnte in späteren Versionen nicht mehr funktionieren)
Delphi-Quellcode:
procedure TmyHint.ActivateHint(Rect: TRect; const AHint: string);
var style:cardinal;
    save_animatewindowproc:pointer;
begin
  save_animatewindowproc:=addr(animatewindowproc);
  animatewindowproc:=nil;
  inherited ActivateHint(rect,aHint);
  animatewindowproc:=save_animatewindowproc;
  
  style:=GetWindowLong(Handle,GWL_ExStyle);
  SetWindowLong(Handle,GWL_EXSTYLE,style or WS_EX_LAYERED);
  SetLayeredWindowAttributes(Handle,Color,100,LWA_ALPHA);
end;
AnimatewindowProc ist ein Zeiger auf die entsprechende WinApi-Funktion, wenn wir diesen Zeiger kurzfristig auf nil setzen wird die Animation nicht gestartet. Das sieht einfach besser aus, da die Animation darin besteht, das Fenster einzublenden.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat