Hier eine Möglichkeit über die Windows-
API die Farbe des Aero-Looks auszulesen, der ab Windows Vista verfügbar ist. Dies kann praktisch sein, wenn man sein Programm an diese Farbe anpassen möchte. Beispielsweise nutzt das neue "Windows Live Mail" diese Funktion, um die Tönung der Menuleisten dynamisch der Aero-Farbe anzupassen. Dies verbessert das äußere Erscheinungsbild des Programms.
Wichtig!: Ich verwende in meinem Quellcode eine Unit mit dem Namen "dwmapi". Diese stammt nicht von mir selbst, sondern von dem User MarcoWarm und ist hier zu finden.
Um die Windows Aero Farbe auszulesen:
Delphi-Quellcode:
uses dwmapi;
...
function GetAeroColor:Tcolor;
{****************************************************}
// Dies Funktion gibt die Aero-Farbe als TColor zurück
// Unterstüzt das OS kein Windows Aero, so wird der
// Wert clnone ausgegeben
{****************************************************}
var
// Gibt an ob Fenster Undurchsichtig sind
// (hier nicht weiter verwendet)
OpaqueBlend: bool;
// Gibt die Farbe an
farbe : dword;
// A=AlphaValue; RGB=R,G und B Farbwerte
A,R,G,B: integeR;
// um festzustellen, ob Aero unterstüzt wird
osVInfo: TOSVersionInfo;
begin
// Feststellen, ob Windows Aero unterstüzt wird
ZeroMemory(@osVinfo, SizeOf(osVinfo));
OsVinfo.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
if (((
not GetVersionEx(osVInfo))
and (osVinfo.dwPlatformId <> VER_PLATFORM_WIN32_NT)
and (osVinfo.dwMajorVersion < 5)))
or (dwmapi.DWM_GetColorizationColor(farbe,OpaqueBlend) = S_False)
then
begin
// Falls nicht wird das Ergebnis clnone ausgegeben
result := clnone;
exit;
end;
// AlphaValue und RGB-Werte ermitteln
A := (farbe
and $FF000000)
shr 24;
R := (farbe
and $FF0000)
shr 16;
G := (farbe
and $FF00)
shr 8;
B := (farbe
and $FF);
// AlphaValue auf RGB-Werte anwenden
// Die 40 ermöglicht eine kräftigere Darstellung der Farbe
r := r + (255-a-40);
g := g + (255-a-40);
b := b + (255-a-40);
// Überprüfen ob die RGB-Werte zulässig sind
if r < 0
then r := 0;
if g < 0
then g := 0;
if b < 0
then b := 0;
if r > 255
then r := 255;
if g > 255
then g := 255;
if b > 255
then b := 255;
// Farbe errechnen und ausgeben
result :=
rgb(r,g,b);
end;
Über die Message
WM_DWMCOLORIZATIONCOLORCHANGED ist es möglich ein Ereignis bei der Veränderung der Aero-Farbe auszulösen.
Ein Beispielprojekt, in dem sowohl die Message
WM_DWMCOLORIZATIONCOLORCHANGED, als auch die Function
GetAeroColor angewendet werden, liegt bei.
Links zum
MSDN:
DwmGetColorizationColor Function
WM_DWMCOLORIZATIONCOLORCHANGED Notification
Über ein Feedback würde ich mich sehr freuen.