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 5 von 10   « Erste     345 67     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, 962x aufgerufen)
 
zahor

 
Delphi 2007 Professional
 
#41
  Alt 20. Jun 2007, 16:29
Also unter dem finalen Vista Home Premium geht es definitiv nicht, wenn ich es mit D7 Enterprise kompiliere.
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

 
Delphi XE7 Architect
 
#42
  Alt 27. Jul 2007, 13:48
Schade eigentlich, das die Kompo zwar für die Beta aber nicht die Final funtioniert. Kennt sonst jemand ne Message, die ich senden kann, m mein Formular im Aero-Glass Lokk darstellen zu können?
Oder wird es bald eine Überarbeitete Version dieser Kompo geben


[EDIT] Hab was gefunden! Verstehe es nur noch nicht ganz. Siehe anhang!
[EDIT2] http://msdn.microsoft.com/msdnmag/is...lt.aspx?loc=de
Angehängte Dateien
Dateityp: zip glasstest_441.zip (1,2 KB, 151x aufgerufen)
Christian
  Mit Zitat antworten Zitat
zahor

 
Delphi 2007 Professional
 
#43
  Alt 27. Jul 2007, 15:28
Also ich habs mal ausprobiert und festgestellt: Alles, was schwarz ist (Also die Caption von den Buttons etc.) ist leider transparent, wie Hanzmeierschulz in Beitrag #31 beschrieben hat.
Das ganze in ein Panel zu setzen (EDIT: oder mit Frames zu arbeiten) ändert auch nichts.
EDIT3: Mit Canvas kann man auch nichts draufzeichnen, zum Beispiel nen einfachen Text oder so.

EDIT2: Ich hab den transparenten Bereich jetzt so geändert, dass alles bis auf eine Fläche, auf der zwei Buttons sind, transparent ist. Diese werden dann korrekt dargestellt.
Die restlichen Buttons werden aber transparent gezeichnet. Da man nur einen Bereich zeichnen kann, ist es ja keine Lösung, alle Elemente auf einen Haufen zu knallen.
Zu den Angaben MTop etc: das bedeutet, BIS MTop ist transparent, BIS MRight auch etc, jeweils von Oben bzw. Rechts usw.
Miniaturansicht angehängter Grafiken
ergebnis_237.jpg  
Angehängte Dateien
Dateityp: zip versuch_204.zip (187,6 KB, 147x aufgerufen)
  Mit Zitat antworten Zitat
atgis
 
#44
  Alt 5. Okt 2007, 13:27
Ist es auch möglich den Glass Effekt unter XP zum laufen zu bringen?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 11 Alexandria
 
#45
  Alt 5. Okt 2007, 13:46
Zitat von atgis:
Ist es auch möglich den Glass Effekt unter XP zum laufen zu bringen?
Nur mit extra Skinning-Engines. Windows XP selbst unterstützt das gar nicht.

......
Daniel W.
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#46
  Alt 5. Okt 2007, 13:46
Wenn Microsoft sich entscheidet die API für XP nachzurüsten.
Markus Kinzler
  Mit Zitat antworten Zitat
01001

 
Turbo Delphi für Win32
 
#47
  Alt 5. Okt 2007, 13:48
Das wurde schon ein paar Beiträge darüber geklärt. Nein. Wenn es ginge, gäbe es ja überhaupt keinen Grund Vista zu kaufen...
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

 
Delphi XE7 Architect
 
#48
  Alt 5. Okt 2007, 17:10
Microsoft hat sogar alles getan, um Programme zu stoppen, die das nachrüsten können.
Christian
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#49
  Alt 19. Okt 2007, 10:01
Da die aktuelle Version der Komponente nur ein schwarzes Fenster bringt hab ich mal einen Anfang gemacht die DWM API zu übersetzen und nach einer alternativen (und meiner Meinung nach) korrekten Lösung des Problems zu suchen.
Im Anhang befindet sich die API und ein kleines Demo-Programm.
ein paar Anmerkungen:
Da "Delphifarben" keinen Alphachannel besitzen muss für die korrekte Transparenzdarstellung die Fensterfarbe schwarz sein. Das bedeutet jedoch, daß sämtliche schwarze labels oder andere GDI-gezeichneten Objekte ebenfalls transparent dargestellt werden. Um trotzdem schwarzen Text auszugeben muss man dann GDI+ bemühen.
Das Demoprojekt läuft auch nur unter Vista (siehe nächsten Post) ... Ich hab keine Plausibilitätskontrollen eingefügt, weil es ja nur eine Demonstration ist.

Ich hoffe es nützt dem einen oder anderen. Das Beispiel und die API sind Produkt von lediglich 2Stunden Arbeit... Also bitte keine zu harte Kritik. Es ist nur quick-n-dirty. Wer Spaß und Zeit hat sollte daraus eine komplette API Übersetzung (samt Komponente?) machen. Sehr schön wäre es auch die Thumbnailpreviews anzuzeigen (*träum*)
Die Anleitungen : http://msdn2.microsoft.com/en-us/library/aa969540.aspx
Miniaturansicht angehängter Grafiken
sheet_of_glass_396.jpg   extended_nc_area_209.jpg   blur_behind_189.jpg  
Angehängte Dateien
Dateityp: zip dwmapi_697.zip (276,6 KB, 217x aufgerufen)
Marco Warm
  Mit Zitat antworten Zitat
Benutzerbild von alias5000
alias5000
 
#50
  Alt 19. Okt 2007, 16:23
Eine kleine Kleinigkeit:
Unter WinXP steht das alles natürlich nciht zur Verfügung. Dein Demoprojekt erzeugt aber auch einen haufen AVs dann.
Auf meinem Vista rechner schau ich mir das noch an

Gruß
alias5000
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 10   « Erste     345 67     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 01:39 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