Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi wie transparentes hint? auch verallgemeinerbar? (https://www.delphipraxis.net/102099-wie-transparentes-hint-auch-verallgemeinerbar.html)

s.h.a.r.k 23. Okt 2007 14:08


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

sirius 23. Okt 2007 15:38

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:
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:
Delphi-Quellcode:
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz