Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für CodeGear Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Aero Glass Effekt für Delphi-Forms
Ein Thema von Hanzmeierschulz.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen
Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
Delphi-PRAXiS Forum - Übersicht -> Open-Source
Seite 1 von 7   [ 93 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5, 6, 7  Weiter
 
 Autor 
 Nachricht 
 
Hanzmeierschulz #1|Beitrag #589719Verfasst am: 04.08.2006, 18:56      Titel: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

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: zusammenfalten | markieren
// 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]

[ An diesen Beitrag wurden eine oder mehrere Dateien angehängt. Zum Herunterladen bitte anmelden. ]

 Zuletzt bearbeitet von CalganX am 08.08.2006, 11:40, insgesamt 2-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
jbg #2|Beitrag #589723Verfasst am: 04.08.2006, 19:03      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 3.117
angemeldet: 12.06.2002
Wohnort: Vöhringen (Bayern)
RAD-Studio 2010 Pro

Ich hoffe du weißt, dass OnActivate nicht das richtige Ereignis dafür ist. Zudem würde ich die DLL laufend laden und entladen. Besser beim ersten Zugriff laden und dann im Speicher lassen.

Ist Zeit wirklich Geld?
Mein Blog - kombiniert mit all meinen Delphi Tools
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #3|Beitrag #589729Verfasst am: 04.08.2006, 19:10      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Ich habe OnActivate deshalb genommen, weil der Effekt nur gesetzt werden kann, wenn das Fenster schon da ist. OnCreate ging bei mir nicht (muss nicht heißen, kann an Vista liegen) und OnShow wird sehr viel öffters aufgerufen als OnActivate.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
mkinzler #4|Beitrag #589731Verfasst am: 04.08.2006, 19:15      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Moderator
Beiträge: 27.703
angemeldet: 09.12.2005
Wohnort: Heilbronn
Delphi 2010 Professional

Dann wäre vielleicht loaded die richtige Methode.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #5|Beitrag #589738Verfasst am: 04.08.2006, 19:22      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Da müsste der Programmierer die Loaded Methode der Form überschreiben. Aber ich wollte eher das Prinzip "Zeile einfügen und geht".
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
jbg #6|Beitrag #589770Verfasst am: 04.08.2006, 20:21      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 3.117
angemeldet: 12.06.2002
Wohnort: Vöhringen (Bayern)
RAD-Studio 2010 Pro

Hanzmeierschulz hat folgendes geschrieben:
OnShow wird sehr viel öffters aufgerufen als OnActivate.

Das meinst du. Wenn du nur ein Formular hast und den Rest modal öffnest, stimmt deine Aussage. Hast du aber mehrere Fenster die "nur" mit Show angezeigt wurden, so wird OnActivate und OnDeactivate bei jedem Fensterwechsel ausgelöst.

Ist Zeit wirklich Geld?
Mein Blog - kombiniert mit all meinen Delphi Tools
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #7|Beitrag #589824Verfasst am: 04.08.2006, 22:01      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Ach ja, stimmt, daran habe ich garnicht gedacht. Ich werde es nochmal mit OnCreate probieren, denn OnCreate Test habe nur während des Testens (nicht mit dieser Unit) benutzt und keinen Erfolg gehabt. Darum kann es sein, dass es denoch klappt.

 Zuletzt bearbeitet von Hanzmeierschulz am 04.08.2006, 22:09, insgesamt 1-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
DGL-luke #8|Beitrag #589832Verfasst am: 04.08.2006, 22:22      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
"Rüsselmops" ;-)
Alter: 21
Status: offline
Beiträge: 4.031
angemeldet: 01.04.2005
Wohnort: Bad Tölz
Delphi 2006 Professional

MÖP!

Im OnCreatze wirds nicht funktionieren, viele Kompoennten sind da noch nicht erstellt (ich sage viele, weil ein paar DInge bei einigen zwischendurch doch klappen).

Das macht man so:

1. private-feld "Init: Boolean" in die Formdeklaration

2. Init := true ins Oncreate

3. Ins OnShow:

Delphi-Quellcode: markieren
if Init then
  begin
    Init := false;

    ......
    .......
    ...
  end;

Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1

 Zuletzt bearbeitet von DGL-luke am 04.08.2006, 22:23, insgesamt 1-mal bearbeitet.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Martin K #9|Beitrag #589834Verfasst am: 04.08.2006, 22:46      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Alter: 23
Status: offline
Beiträge: 899
angemeldet: 20.10.2005
Turbo Delphi für Win32

...oder so: Zwinkern
Delphi-Quellcode: markieren
procedure TForm1.FormShow(Sender: TObject);
begin
  OnShow := nil;
  ...
end;

Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
jbg #10|Beitrag #590064Verfasst am: 05.08.2006, 13:19      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 3.117
angemeldet: 12.06.2002
Wohnort: Vöhringen (Bayern)
RAD-Studio 2010 Pro

Irgendwie ist mir das zu durchsichtig. Ich darf jetzt nicht mehr das Formular anlicken, da der Klick auf das darunterliegende Fenster durchgeht.

Übrigens "function(pfEnabled: PBoolean): HRESULT; stdcall; " ist falsch deklariert. Das PBoolean muss ein PBOOL sein. Mit PBoolean hat er mir unter gewissen umständen Self überschrieben.

Ist Zeit wirklich Geld?
Mein Blog - kombiniert mit all meinen Delphi Tools
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #11|Beitrag #590767Verfasst am: 07.08.2006, 09:30      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

jbg hat folgendes geschrieben:
Irgendwie ist mir das zu durchsichtig. Ich darf jetzt nicht mehr das Formular anlicken, da der Klick auf das darunterliegende Fenster durchgeht.

Übrigens "function(pfEnabled: PBoolean): HRESULT; stdcall; " ist falsch deklariert. Das PBoolean muss ein PBOOL sein. Mit PBoolean hat er mir unter gewissen umständen Self überschrieben.

Danke für den Hinweis habs auch gleich geändert.

Ich habe das ganze jetzt in eine Komponente gepackt, somit fällt das OnActivate oder ähnliches weg. Geht soweit auch gut, nur wie jbg bereits erwähnte, kann man die Form nicht mehr anklicken. Das liegt an der Funktion SetLayeredWindowAttributes, somit wird das Fester bei der Farbe X (clFuchsia) transparent und die Events gehen durch auf das darunterliegente Fenster. Gibts da ne Möglichkeit die Transparenttechnik (nicht Alpha/Teiltransparenz) von SetLayeredWindowAttributes so zu benutzen, dass es nicht durch geht.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #12|Beitrag #591415Verfasst am: 08.08.2006, 10:23      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Hat jemand die winuser.h aus dem letztem Vista SDK (glaube July CTP)?
Ich brauche den Wert für WM_DWMCOMPOMPOSITIONCHANGED. Da das SDK >1GB ist, wollte ich es nicht erst downloaden wegen der Header-Datei.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
NicoDE #13|Beitrag #591433Verfasst am: 08.08.2006, 11:03      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat

Beiträge: 1.663
angemeldet: 08.06.2002


Delphi-Quellcode: markieren
const
  WM_DWMCOMPOSITIONCHANGED        = $031E;
  WM_DWMNCRENDERINGCHANGED        = $031F;
  WM_DWMCOLORIZATIONCOLORCHANGED  = $0320;
  WM_DWMWINDOWMAXIMIZEDCHANGE     = $0321;

"A wise spellweaver always writes in pencil." -- Book of Patterns
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #14|Beitrag #591439Verfasst am: 08.08.2006, 11:13      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Super Danke
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Hanzmeierschulz #15|Beitrag #591608Verfasst am: 08.08.2006, 15:53      Titel: Re: Aero Glass Effekt für Delphi-Forms Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 16
angemeldet: 10.06.2006
Delphi 7 Professional

Habe nun alles in eine Komponente gepackt, zusätzlich wurden noch ein paar Features hinzugefügt und einige Fehler bereinigt.

[ An diesen Beitrag wurden eine oder mehrere Dateien angehängt. Zum Herunterladen bitte anmelden. ]
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Delphi-PRAXiS Forum - Übersicht -> Open-Source Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 7   [ 93 Beiträge ]  Gehe zu Seite 1, 2, 3, 4, 5, 6, 7  Weiter
 
  Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
   
Gehe zu:  
Du darfst keine Beiträge in dieses Forum schreiben.
Du darfst auf Beiträge in diesem Forum nicht antworten.
Du darfst Deine Beiträge in diesem Forum nicht bearbeiten.
Du darfst Deine Beiträge in diesem Forum nicht löschen.
Du darfst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten.
Du kannst Dateien in diesem Forum nicht herunterladen.


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2010 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen