![]() |
wie transparentes hint? auch verallgemeinerbar?
hallo,
mich würde es interessieren, ob es möglich ist den hint einer komponente transparent zu schalten? ich will hierbei aber keine andere komponente verwenden! es soll der standard-hint sein. ebenso müsste es doch evtl. möglich sein jede komponente irgendwie transparent zu bekommen?! wie machen das andere komponenten? mit freundlichen grüßen der hai |
Re: wie transparentes hint? auch verallgemeinerbar?
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:
so, und dann noch TmyHint als Standard-Hint angeben:
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;
Delphi-Quellcode:
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)
Hintwindowclass:=TmyHint;
Delphi-Quellcode:
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.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz