![]() |
PNG Delphi Form, Button Probleme
Hallo,
ich hab da mal eine Frage zu folgendem Beitrag hier im Forum: ![]() Ich hab den Beitrag mit sehr großem Interesse verfolgt, mir ist nur die Sache mit den Buttons unklar, ich hab da folgendes Problem: Sagen wir mal ich benutze den Code von TurboPascal um meine Form komplett geskinnt darzustellen, sieht wirklich extrem gut aus dank der Möglichkeit z.B. am Rand transparente Schatten darstellen zu können usw... Nur wenn ich jetzt auf meine Form sagen wir mal eine TImage Komponente zur Entwurfszeit drauflege, welche später einen Button simulieren soll, dann gibt es extreme Probleme (TImage Inhalt besteht aus ebenfalls einem PNG-Image, welches aus der Resource geladen wird)... Da ist dann schluss mit Transparenz (Seiten sind ich vermute mal csPurple oder so)... Ich frage mich jetzt folgendes, da ich das Problem noch nicht ganz verstanden habe, ob jemand dafür schon eine Lösung gefunden hat und wenn nicht, wenn ich eine neue Komponente schreiben würde, was muss den bei der anders sein, damit dieses Problem nicht auftritt? Gegebenenfalls, vielleicht hat ja jemand auch eine Möglichkeit den Button mit Regionen zu erstellen? Für den Button selber würde ich sehr gerne die Zustände, Mouseover, Down und Leave integrieren, diese Zustände würden dann mittels 3 verschiedener PNG Bilder gewechselt...) Viele Grüße Marc |
Re: PNG Delphi Form, Button Probleme
ich hab mal einen Button erstellt der sagen wir mal "flexibler" ist als der StdButton. Leider hatte ich schon ewig keine Zeit mehr weiter zu entwickeln (hätte mal ein update nötig). Dennnoch sollte es mit dem eigentlich funktionieren. Mit der Transparenz ist es einfach so ne sache, im Moment geht das nur mit Icons. Dann müsstest du einfach deine Button Bilder in Icons umwandeln...
k.A. ob das was bringt, aber kannsts dir ja mal anschauen. ![]() |
Re: PNG Delphi Form, Button Probleme
Zitat:
Nur, das mit Bild in Icon wandeln hab ich nicht ganz kapiert?! Was ich versuche ist folgendes, sagen wir mal ich nehme anstelle eines Buttons ein TImage, in dem Lade ich aus der Resource der Exe, eine PNG Grafik, diese PNG Grafik stellt später in der Anwendung meinen Button da, ich benutze PNG's weil die ja schon eine Transparenz besitzen, wenn ich die in ein TImage lade, ohne das meine Form auf die Layered Windows Api zugreift ist alles Prima, der Hintergrund meiner PNG Grafik welche sich im TImage befindet ist komplett transparent, so wie es sein sollte. Jetzt benutze ich für meine Form, damit diese optisch komplett meiner Grafik entspricht die Layered Windows Api Funktion, meine Form wird komplett unsichtbar hat einen schöne Schlagschatten, jetzt kommts TImage drauf wie oben erwähnt und siehe da, der Hintergrund des TImages mit meinem Bild ist Lila, dass sieht mit verlaub extrem sch.... aus... Was ich vermute ist folgendes, ich denke das diese Grafik im TImage nach dem Laden aus der Resource, eventuell gegen die Form mit Ihrer Grafik geblended werden muss, nur hab ich keine Ahnung wie ich das machen soll, vorallem, wenn es mal eine eigenständige Komponente werden soll (aber das kommt später) im Moment würde es mir schon reichen, wenn das TImage bzw. die Grafik darin so wie die Form transparent wäre... TurboPascal hier aus dem Forum hat mal eine Button Komponente geschrieben, welche PNG's transparent anzeigt, somit ist der Hintergrund und Form des Buttons nicht mehr Grau sondern nimmt das komplette Aussehen der PNG Grafik an ist eigentlich genau das was ich suche. Nur mit dem Button gibt es das gleiche Problem was ich auch mit meinem TImage habe die Ränder werden Lila? Sind somit also nicht mehr Transparent... Was deine Komponente angeht, wenn du meinst ich soll meine PNG's in Icons umwandeln und deine Komponente benutzt diese dann als Komplett für das aussehen des Buttons order zeigt die Icons nur auf dem Button an, dann hilft es nicht weiter... Das warum ich PNG's ebenfalls benutze liegt an folgendes: Stell dir mal vor man zeichnet einen Skin z.B. in Photoshop fürs Fenster. Danach malst du in anderen Layern noch die Buttons auf den Skin... Die Buttons musst du ja irgenwie seperat exportieren damit du sie später in Delphi auf den Skin legen kannst zwecks Benutzung. Wenn jetzt der Hintergrund bzw der Rand in der Komponente die Grafil nicht transparent sind, sehen die Buttons später auf dem Skin so aus, als würden sie nicht dort hingehören (hoffe du weist was ich meine?) So Roman ist fertig :-) Viele Grüsse Marc |
Re: PNG Delphi Form, Button Probleme
Das was du auf der Form sehen möchtest nusst du auf das Bitmap zeichnen welches
mit UpdateLayeredWindow() aufrufst. Alle Button.- Listbox.- Imagekomponenten und der gleichen müssten also umgeschrieben werden so das diese auf das "UpdateLayeredWindow-Bitmap" gezeichnt werden. |
Re: PNG Delphi Form, Button Probleme
Zitat:
Hmmm du hast nicht rein zufällig ein kleines Beispiel rumliegen? Weil ich das noch nie gemacht habe... Mir stellen sich da fragen wie, wie klicke ich dann auf die Grafik? (Mausabfrage usw) wenn ich plötzlich keine Komponente hab und vieles mehr wie z.B. Mouseover , Leave integrieren...? Viele Grüsse Marc |
Re: PNG Delphi Form, Button Probleme
hmm dann mach dir doch eine eigene Kompo die nicht sichtbar ist. Z.B könntest du deine Kompo von TCustomControl ableiten...
dann hast du die Ereignisse die du brauchst bereits vorhanden. Du platzierst diese Komponente dann überall dort wo auf dem Bild ein Button ist. |
Re: PNG Delphi Form, Button Probleme
öhm das problem ist mehr das ich nicht weiss wie ich jetzt den button bzw die grafik des buttons nochmals auf das form png blended soll...
bilder sagen mehr als 1000 worte, hier mal ein beispiel und das lila problem was sich daraus ergibt: ![]() |
Re: PNG Delphi Form, Button Probleme
kannste nicht mal dein Projekt Posten, dann kann ich mal n Blick drüber werfen...
|
Re: PNG Delphi Form, Button Probleme
Jo könnte ich machen, der code exisitert hier aber bereits ist von Turbopascal...
Alles was er benutzt hat, benutze ich auch, mit dem kleinen Unterschied, das ich einen Grafikbutton auf der Form brauche...
Delphi-Quellcode:
Wäre klasse, wenn Du das mal versuchen könntest, da Irgendwie einen Button draufzubekommen, wenn Du dafür eine Beispielgrafik inkl. Buttons brauchst, sag einfach bescheid, kann ich Dir schnell machen...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, PNGImage, GR32, GR32_PNG, PngExtraEx; type TForm1 = class(TForm) Timer1: TTimer; PNGBtnEx1: TPNGBtnEx; PNGBtnEx2: TPNGBtnEx; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure PNGBtnEx1Click(Sender: TObject); private { Private declarations } ScrBmp32, PNGBmp32, tmpBmp32: TBitmap32; BlendF: TBlendFunction; P: TPoint; Size: TSize; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {$R ResMenu.RES} var BlendValue : Byte = 240; // Result is TRUE has Pngimage a Alphachannel. function PNGToBitmap32(DstBitmap: TBitmap32; Png: TPngObject): Boolean; var TransparentColor: TColor32; PixelPtr: PColor32; AlphaPtr: PByte; X, Y: Integer; begin Result := False; DstBitmap.Assign(PNG); DstBitmap.ResetAlpha; case PNG.TransparencyMode of ptmPartial: begin if (PNG.Header.ColorType = COLOR_GRAYSCALEALPHA) or (PNG.Header.ColorType = COLOR_RGBALPHA) then begin PixelPtr := PColor32(@DstBitmap.Bits[0]); for Y := 0 to DstBitmap.Height - 1 do begin AlphaPtr := PByte(PNG.AlphaScanline[Y]); for X := 0 to DstBitmap.Width - 1 do begin PixelPtr^ := (PixelPtr^ and $00FFFFFF) or (TColor32(AlphaPtr^) shl 24); Inc(PixelPtr); Inc(AlphaPtr); end; end; end; Result := True; end; ptmBit: begin TransparentColor := Color32(PNG.TransparentColor); PixelPtr := PColor32(@DstBitmap.Bits[0]); for X := 0 to (DstBitmap.Height - 1) * (DstBitmap.Width - 1) do begin if PixelPtr^ = TransparentColor then PixelPtr^ := PixelPtr^ and $00FFFFFF; Inc(PixelPtr); end; Result := True; end; ptmNone: Result := False; end; end; procedure ChangeCleartype(Canvas: TCanvas; ClearType: Boolean); var lFnt: TLogFont; Fnt: TFont; begin Fnt := TFont.Create; try Fnt.Assign(Canvas.Font); GetObject(Fnt.Handle, sizeof(lFnt), @lFnt); if ClearType then lFnt.lfQuality := DEFAULT_QUALITY else lFnt.lfQuality := NONANTIALIASED_QUALITY; Fnt.Handle := CreateFontIndirect(lFnt); Canvas.Font.Assign(Fnt); finally Fnt.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); var PngImg : TPngObject; begin BorderStyle := bsNone; ScrBmp32 := TBitmap32.Create; PNGBmp32 := TBitmap32.Create; tmpBmp32 := TBitmap32.Create; // Das PNG-Image aus der Resource holen und in ein TBitmap32 // konvertieren. PngImg := TPngObject.Create; try PngImg.LoadFromResourceName(hInstance, 'SMENU'); PNGToBitmap32(PNGBmp32, PngImg); finally PngImg.Free; end; // Das PNGBitmap32 dem Screen-Bitmap32 zuweisen ScrBmp32.Assign(PNGBmp32); // Fenstergrösse anpassen und Position setzen Width := ScrBmp32.Width; Height := ScrBmp32.Height; // Das Fenster mit neuen Parametern ausstatten um Transparenz zu ermöglichen SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED {or WS_EX_TRANSPARENT}); // Fensterblendoptionen festlegen (für UpdateLayeredWindow) BlendF.BlendOp := AC_SRC_OVER; BlendF.BlendFlags := 0; BlendF.SourceConstantAlpha := BlendValue; BlendF.AlphaFormat := AC_SRC_ALPHA; P := Point(0, 0); Size.cx := ScrBmp32.Width; Size.cy := ScrBmp32.Height; end; procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(PNGBmp32); // PNGBmp32.Free; FreeAndNil(tmpBmp32); // tmpBmp32.Free; FreeAndNil(ScrBmp32); // ScrBmp32.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); var bmp : tBitmap; begin try // Png Image auf Bitmap32 "Zeichnen" ScrBmp32.ResetAlpha; ScrBmp32.Assign(PNGBmp32); bmp := GetFormImage; try bmp.TransparentColor := clFuchsia; bmp.Transparent := TRUE; tmpBmp32.Assign(bmp); finally FreeAndNil(bmp); // bmp.Free; end; tmpBmp32.DrawMode := dmBlend; tmpBmp32.CombineMode := cmBlend; // Formbitmap auf ScreenBitmap zeichnen tmpBmp32.DrawTo(ScrBmp32, 0, 0); // aktualisieren des Fensters mit dem neuen Bitmap. BlendF.SourceConstantAlpha := BlendValue; // Blendwert zwischen Desktop und Fenster (0..255) UpdateLayeredWindow( Handle, 0, nil, @Size, ScrBmp32.Handle, @P, 0, @BlendF, ULW_ALPHA); except on E: Exception do begin Timer1.Enabled := FALSE; // Timer aus bei Fehlern, sonst gibt es eine Messageflut... ShowMessage(E.Message); Close; end; end; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if Shift = [ssLeft] then // Das verschieben der Form auf eine einfache Weise begin ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0); end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = vk_escape then close; end; end. Viele Grüsse Marc |
Re: PNG Delphi Form, Button Probleme
ja, schick mir mal so n paar beispielgrafiken, hab grad kein photoshop aufm rechner... dann schau ichs mir mal an...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz