AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Delphi Aero Glass Effekt für Delphi-Forms
Thema durchsuchen
Ansicht
Themen-Optionen

Aero Glass Effekt für Delphi-Forms

Ein Thema von Hanzmeierschulz · begonnen am 4. Aug 2006 · letzter Beitrag vom 1. Jul 2010
Antwort Antwort
Seite 4 von 10   « Erste     234 56     Letzte »    
Hanzmeierschulz
Registriert seit: 10. Jun 2006
Also ich habe mich mit dem neuen Aero Glass Effekt unter Windows Vista beschäftigt. Dabei hatte ich verschiedene Funktionen der neuen DWM Api von MS ausprobiert.
Als Ergebnis habe ich die am sinnvollsten einsetzbare Funktion herausgegriffen und eine Delphi Unit darum gepackt:
Delphi-Quellcode:
// Aero Glass Effekt für Delphi-Forms
//
// Mit der Methode GlassForm kann für eine Form der
// Aero Glass Effekt unter Vista aktiviert werden.
// Der erste Parameter ist die Form-Klasse, der zweite
// optionale Parameter ist der BlurColorKey. Mit dem
// BlurColorKey wird eine Farbe festgelegt, auf dem
// der Effekt wirken soll, d.h. benutzt eine Komponente,
// auf der Form, für visuelle Darstellungen (Linien, Punkte,
// Bilder, ...), diese Farbe, so wird an dieser Stelle der
// Effekt wirksam. Der Standardwert für BlurColorKey ist
// clFuchsia.
//
// Hinweis: Für die Aktivierung wird zusätzlich TXPManifest
// bzw. eine RES-Datei die die Manifest-Daten
// enthält benötigt.
//
//
// Delphi-Unit von Daniel Mitte (2006)
//
//
// Beispiel:
//
// uses glass;
//
// [...]
//
// procedure TForm1.FormActivate(Sender: TObject);
// begin
// GlassForm(Form1);
// // oder mit anderem BlurColorKey
// // GlassForm(Form1, clBlue)
// end;

unit glass;

interface

uses
  Windows,
  Forms,
  Graphics;
  
procedure GlassForm(frm: TForm; cBlurColorKey: TColor = clFuchsia);

implementation

procedure GlassForm(frm: TForm; cBlurColorKey: TColor = clFuchsia);
const
  WS_EX_LAYERED = $80000;
  LWA_COLORKEY = 1;

type
  _MARGINS = packed record
    cxLeftWidth: Integer;
    cxRightWidth: Integer;
    cyTopHeight: Integer;
    cyBottomHeight: Integer;
  end;
  PMargins = ^_MARGINS;
  TMargins = _MARGINS;
  
  DwmIsCompositionEnabledFunc = function(pfEnabled: PBoolean): HRESULT; stdcall;
  DwmExtendFrameIntoClientAreaFunc = function(destWnd: HWND; const pMarInset: PMargins): HRESULT; stdcall;
  SetLayeredWindowAttributesFunc = function(destWnd: HWND; cKey: TColor; bAlpha: Byte; dwFlags: DWord): BOOL; stdcall;

var
  hDWMDLL: Cardinal;
  osVinfo: TOSVERSIONINFO;
  fDwmIsCompositionEnabled: DwmIsCompositionEnabledFunc;
  fDwmExtendFrameIntoClientArea: DwmExtendFrameIntoClientAreaFunc;
  fSetLayeredWindowAttributesFunc: SetLayeredWindowAttributesFunc;
  bCmpEnable: Boolean;
  mgn: TMargins;
  
begin
  ZeroMemory(@osVinfo, SizeOf(osVinfo));
  OsVinfo.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);

  if ((GetVersionEx(osVInfo) = True) and (osVinfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and (osVinfo.dwMajorVersion >= 6)) then
  begin
    hDWMDLL := LoadLibrary('dwmapi.dll');

    if hDWMDLL <> 0 then
    begin
      @fDwmIsCompositionEnabled := GetProcAddress(hDWMDLL, 'DwmIsCompositionEnabled');
      @fDwmExtendFrameIntoClientArea := GetProcAddress(hDWMDLL, 'DwmExtendFrameIntoClientArea');
      @fSetLayeredWindowAttributesFunc := GetProcAddress(GetModulehandle(user32), 'SetLayeredWindowAttributes');
      
      if ((@fDwmIsCompositionEnabled <> nil) and (@fDwmExtendFrameIntoClientArea <> nil) and (@fSetLayeredWindowAttributesFunc <> nil)) then
      begin
        fDwmIsCompositionEnabled(@bCmpEnable);
        
        if bCmpEnable = True then
        begin
          frm.Color := cBlurColorKey;

          SetWindowLong(frm.Handle, GWL_EXSTYLE, GetWindowLong(frm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
          fSetLayeredWindowAttributesFunc(frm.Handle, cBlurColorKey, 0, LWA_COLORKEY);

          ZeroMemory(@mgn, SizeOf(mgn));
          mgn.cxLeftWidth := -1;
          mgn.cxRightWidth := -1;
          mgn.cyTopHeight := -1;
          mgn.cyBottomHeight := -1;

          fDwmExtendFrameIntoClientArea(frm.Handle, @mgn);
        end;
      end;
      
      FreeLibrary(hDWMDLL);
    end;
  end;
end;

end.
Im Anhang sind noch ein Demo-Projekt und zwei Vorschaubilder.

[edit=Chakotay1308]Klassifizierung korrigiert. Mfg, Chakotay1308[/edit]
Miniaturansicht angehängter Grafiken
glass_preview_1_102.jpg   glass_preview_2_157.jpg  
Angehängte Dateien
Dateityp: zip glass_152.zip (110,0 KB, 963x aufgerufen)
 
Hanzmeierschulz

 
Delphi 7 Professional
 
#31
  Alt 17. Sep 2006, 20:07
Bin schon (lange) zu einer Lösung gekommen, aber das wird niemanden gefallen, deshalb suche ich nach einer besseren Lösung und das wird wohl noch etwas dauern.

Wen's interessiert, die Lösung ist, dass man SetLayeredWindowAttributes nicht mehr verwendet. Das hat zur Folge, dass dort wo es schwarz ist, wird das Glass angewendet. Da aber Delphi, GDI und nicht GDI+ verwendet, wird es schwierig sein eine Lösung zu finden, denn GDI kann kein ARGB, d.h. leider macht u.a. Vista den Alpha-Teil = 0 für GDI (nicht Plus). Das bedeutet wiederrum, dass aber 0 für volle Transparenz steht (da verstehe ich MS nicht???). Wie auch immer, der Glass-Effekt wird aber auf Schwarz (bis vor kurzem auch alle anderen Farben) mit Alpha=0 angewendet. Somit würde das Glass auf normalen GDI Anwendungen gehen, nur leider auch in Textboxen und anderen Controls, die Schwarz verwenden. Hätte nur MS in beiden Fällen Alpha=255 gewählt oder zumindest beim DWM die freie Wahl gelassen. Mit SetLayeredWindowAttributes konnte man dieser GDI vs. ARGB entgegensteuern, nur hat MS dort seit 5536 was geändert das sich SetLayeredWindowAttributes mit DWM nicht mehr so richtig verträgt.

Mal sehen ob es da eine Lösung gibt, ich suchen...
  Mit Zitat antworten Zitat
shifter

 
Delphi 2007 Enterprise
 
#32
  Alt 28. Sep 2006, 18:35
Das ist aber sehr enteuschend , habe die Version 5728 und bleibt auch alles schwarz.



gruss
seba
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#33
  Alt 26. Okt 2006, 19:31
Hat schon jemand ne richtige Lösung?

Ich habs mal ohne "SetLayeredWindowAttributes" versucht, aber so wirklich der bringer isses ja nu nicht. Ich würd mir wünschen wenns eine richtige Lösung gäbe!
  Mit Zitat antworten Zitat
mimarsinan
 
#34
  Alt 28. Okt 2006, 14:12
Hi,

Sorry for the English - my German is non-existent!

I was looking for someone who could help fix this component? I am trying it on the latest RC2 of Vista and its showing black instead of glass...

I would like to hire a developer who will fix and enhance the component as follows:

1) Make sure the glass effects are proper
2) Allow the glass color to be tinted in a particular color (ex: pink, green, etc)
3) Make sure that when objects are placed on glass regions, they render properly
4) Especially for plain text objects on glass, and other objects as possible, allow for a mechanism whereby they can be painted with a background glow (like the captions of Windows on Vista) so they are easier to read

My budget is $500. Please contact me at mimarsinan@gmail.com directly, post back here, or send PMs (in that order of priority) if you can do all 4 steps above. Thank you!
  Mit Zitat antworten Zitat
Jonas

 
Delphi 2007 Professional
 
#35
  Alt 15. Nov 2006, 10:30
noch immer nichts neues? oô
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE
MuTzE
 
#36
  Alt 24. Jan 2007, 07:33
Jop. Find die Komponente richtig gut! Hoffe es wird bald gefixt.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

 
Delphi XE7 Architect
 
#37
  Alt 19. Mai 2007, 16:06
Wurde inzwischen eine Lösung gefunden? Oder gibts ne andere Methode, den Glasseffekt auf das ganze Formular auszuweiten?
Christian
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

 
Delphi 2006 Professional
 
#38
  Alt 19. Mai 2007, 20:53
Zitat von Hanzmeierschulz:
Das bedeutet wiederrum, dass aber 0 für volle Transparenz steht (da verstehe ich MS nicht???).
Das ist normal. Alpha=255 bedeutet voll opak, Alpha=0 bedeutet volle Transparenz. Das ist überall so

Kleine Anmerkung: Kann man die GDI-Calls application-wide hooken und durch GDI+-Calls ersetzen?
Lukas Erlacher
  Mit Zitat antworten Zitat
xaromz

 
Delphi 2006 Enterprise
 
#39
  Alt 27. Mai 2007, 08:44
Hallo,
Zitat von DGL-luke:
Kleine Anmerkung: Kann man die GDI-Calls application-wide hooken und durch GDI+-Calls ersetzen?
das kann nicht funktionieren. GDI+ ist ja nur eine Schicht, die über das GDI gelegt wird (und auch noch ganz anders funktioniert). Du hättest also eine Endlosschleife.

Gruß
xaromz
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

 
Delphi 2006 Professional
 
#40
  Alt 27. Mai 2007, 21:37
Ok, das wusste ich nicht
Lukas Erlacher
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 10   « Erste     234 56     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 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