Delphi-PRAXiS
Seite 3 von 3     123   

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)

EWeiss 18. Jun 2007 14:39

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

Zitat von Yheeky
Also vom Zeichnen her klappt bei mir alles. Es geht lediglich darum, dass das Image beim Vergrößern der Form, auch nach wie vor die Zeichenfläche der Form benutzt. Das ist irgendwie nicht der Fall, wie man in meinem letzten Posting an dem Bild im Anhang erkennt kann.
Bei deinem Beispiel kann ich das leider auch nicht finden, weil du bei deiner Form auch keine Veränderung der Größe zulässt.

???

Warum klar kannst du die größe verändern.
Unten in der rechten Ecke MouseDown und ziehen.

gruss Emil

Khabarakh 18. Jun 2007 14:55

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

Zitat von Yheeky
Ja, habe ich ja versucht, aber bei Form1.OnResize bzw. OnPaint geht´s nicht :-(

:gruebel: Dann kann der Fehler aber so langsam nicht mehr in der VCL oder meinem Sieb von Gedächtnis liegen, sondern definitiv in deinem Code.

Yheeky 18. Jun 2007 15:07

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
@EWeiss: Okay, sorry, hatte ich nicht gesehen.

Habe nun das Problem gefunden. Man muss die Größe unter Picture.Graphic noch anpassen, dann geht es:

Delphi-Quellcode:
Image1.Picture.Graphic.Width := Image1.Width;
Image1.Picture.Graphic.Height := Image1.Height;
Danke an alle, die mir bei der Problemlösung geholfen haben :) :thumb:

Yheeky 18. Jun 2007 16:21

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Nun kommt es wieder zum Problem mit der Transparenz :cry:
Ich kann auf das Bit vom Typ TBitmap32 nicht zeichnen :-( Wenn ich auf das Canvas zeichnen möchte kommt die Meldung "Zeichnen auf Leinwand nicht erlaubt". Wie mache ich das denn nun?

EWeiss 18. Jun 2007 17:28

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

Zitat von Yheeky
Nun kommt es wieder zum Problem mit der Transparenz :cry:
Ich kann auf das Bit vom Typ TBitmap32 nicht zeichnen :-( Wenn ich auf das Canvas zeichnen möchte kommt die Meldung "Zeichnen auf Leinwand nicht erlaubt". Wie mache ich das denn nun?

Ich verstehe nicht so ganz was du vorhast.
Du hast ne Form und willst dieser ein aussehen ala Vista spendieren ? oder was!
Wenn ja dann mach dir ein standart Picture in dem sich einzelne bereiche der Pictures welche du auf
die Form setzen willst befinden.

Dann kannst du über 2 API's auf ein Image kopieren.
Das geht dann über BitBlt und StretchBlt

gruss Emil

Khabarakh 18. Jun 2007 19:01

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

Zitat von Yheeky
Wie mache ich das denn nun?

Benutzt man die Graphics32-Lib, ist es nicht unklug, auch die Graphics32-Funktionen zu benutzen ;) . Es existiert keine TCanvas32, alle Routinen sind direkt in TBitmap32 enthalten. Und unter denen wirst du auf jeden Fall etwas Passendes finden (afair besitzt Draw(To) zum Bleistift einige Überladungen mehr als das VCL-Äquivalent).

Yheeky 18. Jun 2007 21:33

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Okay, danke für den Hinweis, dass ich direkt auf die Funktionen Draw und DrawTo zugreifen muss.
Das habe ich nun gemacht und bin dann nach dem gewohnten Schema vorgegangen, doch leider ist es wohl nur "oberflächlich" gezeichnet werden. Die Form jedenfalls bleibt leer.

Hier der Code:

Delphi-Quellcode:
procedure TfrmMain_Maske.FormCreate(Sender: TObject);
var Alpha : Boolean;
    I : Integer;
    ObenLinks, ObenMitte, ObenRechts,
    RandLinks, RandRechts,
    UntenLinks, UntenMitte, UntenRechts : TBitmap32;
    ObenLinksStream, ObenMitteStream, ObenRechtsStream,
    RandLinksStream, RandRechtsStream,
    UntenLinksStream, UntenMitteStream, UntenRechtsStream : TResourceStream;
begin
  // Hintergrundbild erstellen
  Background := TBitmap32.Create;
  Background2 := TBitmap32.Create;

  // Formkacheln erstellen
  ObenLinks := TBitmap32.Create;
  ObenMitte := TBitmap32.Create;
  ObenRechts := TBitmap32.Create;

  RandLinks := TBitmap32.Create;
  RandRechts := TBitmap32.Create;

  UntenLinks := TBitmap32.Create;
  UntenMitte := TBitmap32.Create;
  UntenRechts := TBitmap32.Create;

  try
   // Formkacheln laden
   ObenLinksStream := TResourceStream.Create(Hinstance, 'ObenLinks', PChar('RC_DATA'));
   ObenMitteStream := TResourceStream.Create(Hinstance, 'ObenMitte', PChar('RC_DATA'));
   ObenRechtsStream := TResourceStream.Create(Hinstance, 'ObenRechts', PChar('RC_DATA'));

   RandLinksStream := TResourceStream.Create(Hinstance, 'RandLinks', PChar('RC_DATA'));
   RandRechtsStream := TResourceStream.Create(Hinstance, 'RandRechts', PChar('RC_DATA'));

   UntenLinksStream := TResourceStream.Create(Hinstance, 'UntenLinks', PChar('RC_DATA'));
   UntenMitteStream := TResourceStream.Create(Hinstance, 'UntenMitte', PChar('RC_DATA'));
   UntenRechtsStream := TResourceStream.Create(Hinstance, 'UntenRechts', PChar('RC_DATA'));

   LoadPNGIntoBitmap32(ObenLinks, ObenLinksStream, Alpha);
   LoadPNGIntoBitmap32(ObenMitte, ObenMitteStream, Alpha);
   LoadPNGIntoBitmap32(ObenRechts, ObenRechtsStream, Alpha);

   LoadPNGIntoBitmap32(RandLinks, RandLinksStream, Alpha);
   LoadPNGIntoBitmap32(RandRechts, RandRechtsStream, Alpha);

   LoadPNGIntoBitmap32(UntenLinks, UntenLinksStream, Alpha);
   LoadPNGIntoBitmap32(UntenMitte, UntenMitteStream, Alpha);
   LoadPNGIntoBitmap32(UntenRechts, UntenRechtsStream, Alpha);

   // FormSkin in Kacheln auf die Form zeichnen
   // Oben links
   Background.Draw(0,0, ObenLinks);

   // Oben Mitte
   for I := ObenLinks.Width to Self.ClientWidth-ObenRechts.Width do
   Background.Draw(I,0, ObenMitte);

   // Oben Rechts
   Background.Draw(Self.ClientWidth-ObenRechts.Width,0, ObenRechts);

  finally
   ObenLinksStream.Free;
   ObenMitteStream.Free;
   ObenRechtsStream.Free;

   RandLinksStream.Free;
   RandRechtsStream.Free;

   UntenLinksStream.Free;
   UntenMitteStream.Free;
   UntenRechtsStream.Free;
  end;

  SetWindowLong(Handle, GWL_EXSTYLE,
  GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED {or WS_EX_TRANSPARENT});
  // WS_EX_TRANSPARENT macht das Fenster für Mausklicks transparent

  BlendF.BlendOp := AC_SRC_OVER;
  BlendF.BlendFlags := 0;
  BlendF.SourceConstantAlpha := 255;
  BlendF.AlphaFormat := AC_SRC_ALPHA;
  P := Point(0, 0);
  Size.cx := Background.Width;
  Size.cy := Background.Height;

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

  Left := 0;
  Top := 0;

end;

Yheeky 19. Jun 2007 13:00

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Hatte die LoadPNGIntoBitmap32 - Aufrufe im Quellcode vergessen...dachte schon das Problem sei nun gelöst, aber leider gelingt mir das "Zusammensetzen" einer PNG-Datei mit anschließendem Zeichnen über UpdateLayeredWindow immer noch nicht. :cry:
Wenn jemand eine Idee hat einfach posten!

Yheeky 21. Jun 2007 15:17

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
*push* :(

Keiner eine Idee oder eine Erklärung warum das nicht funktioniert? :cry:

Yheeky 30. Jun 2007 19:24

Re: [UpdateLayeredWindow] Vergrößerbare Form realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

so, ich bin inzwischen etwas weiter gekommen. Soweit funktioniert das Zeichnen, aber der Alpha-Kanal ist irgendwie nicht richtig. Sind das wommöglich die falschen Alpha-Bilder?
Habe mal ein Beispiel geschrieben. Vielleicht kann sich das mal einer ansehen und mir einen Tipp geben, woran das liegt, dass das Bild nicht richtig transparent angezeigt wird. Wäre super, danke!

Noch eine Info zum Beispiel: Mit den Pfeiltasten "Hoch" und "Runter" wird die Form in der Größe verändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 Uhr.
Seite 3 von 3     123   

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