AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi [UpdateLayeredWindow] Vergrößerbare Form realisieren
Thema durchsuchen
Ansicht
Themen-Optionen

[UpdateLayeredWindow] Vergrößerbare Form realisieren

Ein Thema von Yheeky · begonnen am 16. Jun 2007 · letzter Beitrag vom 30. Jun 2007
Antwort Antwort
Seite 1 von 3  1 23      
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

[UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 15:13
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?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 15:16
Was geschieht denn beim Vergrößern? Passt du währenddessen auch den Parameter "Size" an?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#3

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 15:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 15:45
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#5

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 15:59
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?
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 16:14
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#7

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 16:29
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...
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 16:47
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#9

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 16. Jun 2007, 19:00
Okay, klingt logisch...werde ich die Tage mal austesten. Danke schonmal!
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#10

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren

  Alt 17. Jun 2007, 14:38
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:
Angehängte Grafiken
 
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 04:30 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