Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [UpdateLayeredWindow] Vergrößerbare Form realisieren (https://www.delphipraxis.net/94113-%5Bupdatelayeredwindow%5D-vergroesserbare-form-realisieren.html)

Yheeky 16. Jun 2007 15:13


[UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Hi,

ich habe eine Optionsform, die ich mit einem transparenten Rahmen zeichne lasse. Das mache ich so:

Delphi-Quellcode:
procedure TfrmOptionen_Maske.FormCreate(Sender: TObject);
var Alpha : Boolean;
    ResStream : TResourceStream;
begin
Bit := TBitmap32.Create;

ResStream := TResourceStream.Create(Hinstance, 'BackOpt', PChar('RC_DATA'));
try
   LoadPNGIntoBitmap32(Bit, ResStream, Alpha);
finally
   ResStream.Free;
end;

  SetWindowLong(Handle, GWL_EXSTYLE,
  GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED {or WS_EX_TRANSPARENT});
 
  BlendF.BlendOp := AC_SRC_OVER;
  BlendF.BlendFlags := 0;
  BlendF.SourceConstantAlpha := 255;
  BlendF.AlphaFormat := AC_SRC_ALPHA;
  P := Point(0, 0);
  Size.cx := Bit.Width;
  Size.cy := Bit.Height;

  UpdateLayeredWindow(Handle, 0, nil, @Size, Bit.Handle, @P, 0, @BlendF, ULW_ALPHA);

  Left := frmOptionen.Left;
  Top := frmOptionen.Top;

end;
Das Problem hierbei ist nun, dass das Zeichnen der Form nur funktioniert, wenn die Form in der Größe nicht verändert werden kann. Wie kann ich mit diesem Prinzip Sizable Forms erstellen?

Khabarakh 16. Jun 2007 15:16

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Was geschieht denn beim Vergrößern? Passt du währenddessen auch den Parameter "Size" an?

Yheeky 16. Jun 2007 15:34

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Bisher mache ich noch nichts, da das Bild ja nur in einer fixen Größe vorlag. Ich hatte das Fenster 350x330 groß und dementsprechend war die PNG groß, welche dann auf die Maskenform gezeichnet wurde.
Nun soll sich aber die Größe der Form verändern lassen...und da liegt das Problem. :roll:

Khabarakh 16. Jun 2007 15:45

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Dann probier es doch einfach mal aus. Übergib Update[...] ein größeres Bitmap und passe entsprechend Size an. Ich habe es noch nie ausprobiert, aber das sollte eigentlich funktionieren, schließlich schafft das WPF auch.

Yheeky 16. Jun 2007 15:59

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Das Problem ist ja aber, dass ich die neue Größe nicht kenne. Das heisst ein Bild von der neuen Größe muss "erstellt" werden. Länge der Titelleiste und der Rahmen muss ja bei einer größeren Form auch größer sein...weisst du was ich meine?

PS: Was ist WPF?

Khabarakh 16. Jun 2007 16:14

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Nein, ich verstehe nicht wirklich, was du meinst ;) . Nehmen wir mal an, das Fenster ließe sich durch Ziehen an der unteren rechten Ecke vergrößern. Dann musst dir die Mausposition beim OnMouseDown merken, aus der Differenz zur Position aus jedem OnMouseMove/Up kannst du dann die neue Größe des Fensters errechnen. Dann erstellst du ein Bitmap dieser Größe, füllst es mit deinem Fensterinhalt (wie auch immer dieser gestaltet sein mag) und rufst UpdateLayeredWindow auf.

Yheeky 16. Jun 2007 16:29

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Okay, ich versuche es mal zu erklären. So ist mein Fenster zur Zeit aufgebaut:

Delphi-Quellcode:
Icon ----- X
|          |
|          |
|          |
|----------|
Angenommen ich vergrößere das Fenster nun minimal, dann brauche ich ja schon ein komplett neues Bild, was ich auf die Form zeichne.

Delphi-Quellcode:
Icon ------ X
|           |
|           |
|           |
|           |
|-----------|
Nun sind es 6 "-" in der Titelleiste anstatt 5. Dass auch der Rahmen "verlängert" werden muss, kann man ja auch erkennen. Ich kann also kein festes Bild nehmen, sondern muss Einzelteile erstellen. Nur wie bekomme ich die als PNG?

Wenn du´s immer noch nicht verstanden hast, kein Problem. Dann versuche ich mal eine Grafik zu machen...

OregonGhost 16. Jun 2007 16:47

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Zitat:

Ich kann also kein festes Bild nehmen, sondern muss Einzelteile erstellen. Nur wie bekomme ich die als PNG?
UpdateLayeredWindow will kein PNG. Du übergibst ihm eine 32-Bit-Grafik mit Alphakanal. Und die musst du ganz einfach selbst zeichnen, wie du im Prinzip ja schon selbst gesagt hast. Das geht zum Beispiel, indem du die Einzelteile (z.B. vier Ecken, vier Kanten und einen Mittelteil) entweder als einzelne Grafiken oder als eine große Grafik, die sie alle enthält, lädst und diese dann entsprechend wie in deinem ASCII-Bild dargestellt auf eine Bitmap zeichnest. Und die gibst du dann UpdateLayeredWindow.

Yheeky 16. Jun 2007 19:00

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Okay, klingt logisch...werde ich die Tage mal austesten. Danke schonmal!

Yheeky 17. Jun 2007 14:38

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich muss nochmal nachfragen: Ich habe in meinem festen Fenster einen Schattenverlauf und somit benötige ja ein 32-Bit Bild als Alpha-Channel. Wie erstelle ich das?
Hier mal ein Teil der Beispielform:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:29 Uhr.
Seite 1 von 3  1 23      

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