Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bild auf Bild kopieren/übermalen & Transparenz (https://www.delphipraxis.net/168869-bild-auf-bild-kopieren-uebermalen-transparenz.html)

Cyberaxx 15. Jun 2012 08:49

Bild auf Bild kopieren/übermalen & Transparenz
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und guten Morgen,

Hoffe das ich mit der Sparte hier nicht ganz falsch bin, es geht ja ums GUI-Design.
Ich habe auf meinem Formular Bilder als Buttons(JvImage) mit Hover Funktion.
Sowiet ist das alles auch wunderbar. Jetzt bin ich aber auf die Idee gekommen noch zusätzlich
etwas auf den "Button" zu zeichnen, wie beim iPhone. Gewisse Unterformulare Zeigen Datensätze an
und ich würde auf dem "Button" die Anzahl ausgeben.
Ich lade also im Hintergrund die Zahlen Icons und Male sie dann mittels Canvas.Draw auf mein JvImage.

Klappt auch. was aber nicht klappt ist es die Zahl wieder zu entfernen. Wenn ich das Original Image dort
zeichne dann sehe ich das Zahlen Icon immernoch im Hintergrund. Alle Bilder sind PNG's und haben ihre
Transparenz.
Zum besseren Verständnis habe ich natürlich auch einen Screen von den einzelnen Bildern und die beiden
Situationen wie es bisher ausschaut.

http://vnetcore.com/screens/Images.jpg

Zusätzlich noch als Anhang.
Hoffe das mir jemand helfen kann.

Gruß
Daniel

Bummi 15. Jun 2012 09:30

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Wenn Du keine eigen Komponente schreiben willst, wirst Du IMHO die "leeren" Bilder getrennt verwalten und bei Änderungen der Anzahlt etc. die Pictures neu erstellen und zuordnen müssen.

Cyberaxx 15. Jun 2012 10:06

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Hmmm... Mache ich doch auch?

Ich habe einmal ein TPNGImage in dem das Button Bild lieft und einmal ein TPNGImage in dem das Icon liegt.

Zur Design Time ist jedilich das Bild ohne Icon vorgeladen.
Beim starten werden die beiden TPNGImages gefüllt mit den Bildern.

Bisher natürlich nur auf Klickt um mein Programm nicht direkt zu versauen.
Dann wird auf den Canvas vom JvImage.Picture eben das Icon gezeichnet.

Delphi-Quellcode:
JvImage1.Picture.Bitmap.Canvas.Draw(X,Y, IconImage);
so jetzt soll eben das Icon nicht mehr angezeigt werden und ich nutze die Funktion.

Delphi-Quellcode:
  var
    DestFrame: TRect;
begin
  DestFrame := ButtonImage.Canvas.ClipRect;
  JvImage1.Picture.Bitmap.Canvas.StretchDraw(DestFrame, ButtonImage);
Damit bekomme ich eben das letzte Bildchen aus dem angehängten Bild.
Dabei sollte doch, wenn ichs richtig verstanden habe der gesamte Bereich übermalt werden.
Leider sind eben die Bilder dabei Transparent.

Wie kann ich denn das Picture der Komponente neu erstellen zur Laufzeit? Auf nil setzen und dann normal wieder laden?
Wie würde das denn von der Performance aussehen?

himitsu 15. Jun 2012 10:10

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Dein Button-Bild übermalt eben nur da, wo es auch was zu malen hat. An transparenten Stellen malt es eben nichts hin. :stupid:
Du mußt also das ganze Bild vorher leer machen oder eine Neues nehmen, wo dann der Button draufgemalt wird.

Oder lade das Button-Bild in das angezeigt Image, anstatt es draufzumalen.
Also nur die Zahl wird gemalt, vorher das Button-Bild wird geladen und damit alles Alte überschrieben übermalt.

Bummi 15. Jun 2012 10:50

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Ich bastle mir für so etwas gerne eigene Komponenten auf Basis von TGraphicControl mit GDI +,
da Du JvImage verwenden möchtest, was ich meinte geht in diese Richtung, kann durchaus noch Fehler beinhalten.
(Annahme Imagelisten mit 32-Bit , PNG's)

Delphi-Quellcode:
function CombineIcons(FrontIcon, BackIcon: HIcon): HIcon;
// von http://www.swissdelphicenter.ch/torry/showcode.php?id=1636
var
  WinDC: HDC;
  FrontInfo: TIconInfo;
  FrontDC: HDC;
  FrontSv: HBITMAP;
  BackInfo: TIconInfo;
  BackDC: HDC;
  BackSv: HBITMAP;
  BmpObj: tagBitmap;
begin
  WinDC := GetDC(0);

  GetIconInfo(FrontIcon, FrontInfo);
  FrontDC := CreateCompatibleDC(WinDC);
  FrontSv := SelectObject(FrontDC, FrontInfo.hbmMask);
  GetIconInfo(BackIcon, BackInfo);
  BackDC := CreateCompatibleDC(WinDC);
  BackSv := SelectObject(BackDC, BackInfo.hbmMask);
  GetObject(FrontInfo.hbmMask, SizeOf(BmpObj), @BmpObj);
  BitBlt(BackDC, 0,0,BmpObj.bmWidth, BmpObj.bmHeight, FrontDC, 0,0,SRCAND);
  SelectObject(BackDC, BackInfo.hbmColor);
  DrawIconEx(BackDC, 0,0,FrontIcon, 0,0,0,0,DI_NORMAL);
  Result := CreateIconIndirect(BackInfo);
  SelectObject(FrontDC, FrontSv);
  DeleteDC(FrontDC);
  SelectObject(BackDC, BackSv);
  DeleteDC(BackDC);
  ReleaseDC(0,WinDC);
  DeleteObject(FrontInfo.hbmColor);
  DeleteObject(FrontInfo.hbmMask);
  DeleteObject(BackInfo.hbmColor);
  DeleteObject(BackInfo.hbmMask);
end;

procedure TForm5.SetButton(Picture:TPicture;ButtonList,ZahlenList:TImageList;ButtonIndex:Integer;StateIndex:Integer);
  var
   ico,ico2,ico3:TIcon;
   c:TMetafileCanvas;
  begin
      ico := TIcon.Create;
      ico2 := TIcon.Create;
      ico3 := TIcon.Create;
      try
       ButtonList.GetIcon(ButtonIndex,ico);
       if StateIndex>0 then
          begin
            ZahlenList.GetIcon(StateIndex,ico2);
            ico3.Handle := CombineIcons(ico2.Handle,ico.Handle);
            Picture.Assign(ico3);
          end else Picture.Assign(ico);
      finally
        ico.Free;
        ico2.Free;
        ico3.Free;
      end;

  end;

procedure TForm5.FormCreate(Sender: TObject);
begin
   SetButton(JVImage1.Picture,ImageButtons,ImageZahlen,0,1);
   SetButton(JVImage1.Pictures.PicEnter,ImageButtonsHoover,ImageZahlen,0,1);
end;

Cyberaxx 15. Jun 2012 11:24

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Das ist auch eine nette Funktion. An Imagelisten habe ich noch nicht gedacht gehabt.
Später ist es so das alle Icons/Buttons in einem Archive sind und dementsprechend draus
geladen werden um nicht so viel in die EXE zu packen.

Das Anzeigen selbst klappte ja bisher auch. Nur das übermalen hat ja nicht geklappt.
Hatte mir da nun etwas zusammen geschustert.
Dazu habe ich dann aber noch eine Frage.

Delphi-Quellcode:
  var
    MStream: TMemoryStream;
begin
  try
    MStream := TMemoryStream.Create;
    MStream.Position := 0;
    ButtonImage.SaveToStream(MStream);
    MStream.Position := 0;
    JvImage1.Picture.Bitmap.LoadFromStream(MStream);
  finally
    MStream.Free;
  end;
Ich habs, da ich den letzten Beitrag noch nicht gesehen hatte, dem Tip von Himitsu zu folgen.
Da müsste ich doch richtig in der Annahme gehen, ich speicher das Originalbild in den Stream und lade es von dort aus aufs JvImage. Nur leider wird dann nichts mehr angezeigt.

Wenn ich nun aber
Delphi-Quellcode:
JvImage1.Picture.Bitmap.Canvas.Draw(0,0, ButtonImage);
noch zusätzlich einfüge wirds normal dargestellt aber... ich versteh da scheinbar gerade etwas nicht.


@Bummi Na die JvImage Komponente bietet so ja schon alles was ich brauche. Bilder für mehrere Modis ohne groß etwas eigentsändiges zu entwickeln. War dadurch die erste Wahl.
Ich Bastel da mal ein wenig rum :)

Bummi 15. Jun 2012 11:50

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
irgend etwas ist bei uns unterschiedlich konfiguriert.

das von Dir beschriebene

Zitat:

JvImage1.Picture.Bitmap.Canvas.Draw(0,0, ButtonImage);
funktioniert bei mir nicht, da dort PNG's zugeordnet wurden, wenn man direkt JvImage1.canvas zugreift kommt es dann auch zu der erwarteten Fehlermeldung.

Cyberaxx 15. Jun 2012 12:11

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Zitat:

Zitat von Cyberaxx (Beitrag 1171009)
Zur Design Time ist jedilich das Bild ohne Icon vorgeladen.

Darum geht das ohne Probleme. :)
Hab daheim noch einen Quelltext liegen damit kann ih das Image auch direkt erstellen ohne es zur Design Zeit zu laden. Hatte ich aber gerade eben nicht parat

himitsu 15. Jun 2012 12:28

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Zitat:

Delphi-Quellcode:
var
  MStream: TMemoryStream;
begin
  try
    MStream := TMemoryStream.Create;
    MStream.Position := 0; // nach'm Erstellen ist das sowieso immer 0 ;)
    ButtonImage.SaveToStream(MStream);
    MStream.Position := 0;
    JvImage1.Picture.Bitmap.LoadFromStream(MStream);
  finally
    MStream.Free;
  end;

Was ist ButtonImage für ein Typ?

Delphi-Quellcode:
begin
  JvImage1.Picture.Bitmap.Assign(ButtonImage);

Cyberaxx 15. Jun 2012 12:47

AW: Bild auf Bild kopieren/übermalen & Transparenz
 
Das ist vom Typ TPMGImage


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 Uhr.
Seite 1 von 2  1 2      

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