AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PNG Delphi Form, Button Probleme

Ein Thema von stOrM · begonnen am 9. Apr 2008 · letzter Beitrag vom 13. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#1

PNG Delphi Form, Button Probleme

  Alt 9. Apr 2008, 00:34
Hallo,
ich hab da mal eine Frage zu folgendem Beitrag hier im Forum:

Delphi-Praxis

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
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#2

Re: PNG Delphi Form, Button Probleme

  Alt 9. Apr 2008, 07:29
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.

TEButton
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: PNG Delphi Form, Button Probleme

  Alt 9. Apr 2008, 09:44
Zitat von cherry:
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.

TEButton
Ersma: Sieht super aus deine Komp!

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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: PNG Delphi Form, Button Probleme

  Alt 9. Apr 2008, 21:56
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: PNG Delphi Form, Button Probleme

  Alt 10. Apr 2008, 08:33
Zitat von turboPASCAL:
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: PNG Delphi Form, Button Probleme

  Alt 12. Apr 2008, 18:38
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.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: PNG Delphi Form, Button Probleme

  Alt 13. Apr 2008, 03:02
ö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: experts-exchange
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: PNG Delphi Form, Button Probleme

  Alt 14. Apr 2008, 07:15
kannste nicht mal dein Projekt Posten, dann kann ich mal n Blick drüber werfen...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: PNG Delphi Form, Button Probleme

  Alt 14. Apr 2008, 17:06
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:
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.
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...

Viele Grüsse
Marc
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#10

Re: PNG Delphi Form, Button Probleme

  Alt 15. Apr 2008, 10:33
ja, schick mir mal so n paar beispielgrafiken, hab grad kein photoshop aufm rechner... dann schau ichs mir mal an...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:43 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