AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia GDI+ Images zur Laufzeit austauschen
Thema durchsuchen
Ansicht
Themen-Optionen

GDI+ Images zur Laufzeit austauschen

Ein Thema von EWeiss · begonnen am 22. Jun 2012 · letzter Beitrag vom 22. Jun 2012
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

GDI+ Images zur Laufzeit austauschen

  Alt 22. Jun 2012, 00:07
Hab ja schon viel mit GDI+ gemacht bekomme es aber einfach nicht hin
zwei Images zur Laufzeit auszutauschen ohne die neue Datei auf die Platte zu kopieren.

Ich lade ein Image ein Anzeige alles Ok!
Danach zeichne ich einen Rect mit der Farbe die ich aus ShowColor eingefügt habe
um anzuzeigen das der aktuelle Font die Farbe gelb hat als beispiel.

Jetzt habe ich aber mehrere Funktionen bei denen die Farbe geändert werden kann
aber jedes Bild das ich einlade um die Farbvorschau anzuzeigen ist das gleiche
daher kann ich nicht auf die Platte ausweichen da in diesem Fall dann alle Images die Farbe gelb anzeigen würden.

Das problem ist nur das beim nächsten WM_PAINT das alte Image ohne gelben Rechteck gezeichnet wird.

Kann man die Images vertauschen oder nicht?
Hab dafür noch keine lösung gefunden.

So erstelle ich das gelbe Quadrat im Image

Delphi-Quellcode:
procedure TSkinEngine.skGdipFillRect(Graphics: cardinal; x1, y1, x2, y2: integer;
  ARGB: COLORREF);
var
  hBrush: Pointer;
begin
  GdipCreateSolidFill(ARGB, hBrush);
  GdipFillRectangleI(Graphics, hBrush, x1, y1, x2, y2);
  GdipDeleteBrush(hBrush);
end;
Delphi-Quellcode:
procedure TSkinImageButton.SetColor(const Value: ColorRef);
var
  Dc: HDC;
  Graphics: Cardinal;
  StateMax: Integer;
  Color: ColorRef;
  rc: TRect;

begin
  Dc:= GetDc(FHImageButton);
  StateMax := SkinEngine.GetButProperty(FHImageButton, PROP_STATEMAX);
  Color := skinEngine.ColorARGB(255, Value);

  GetClientRect(FHImageButton, rc);

  if GdipCreateFromHDC(DC, Graphics) = OK then
     SkinEngine.skGdipFillRect(Graphics, rc.Left + 6, rc.Top + 6,
       (rc.Right div StateMax) + 10, rc.Bottom - 10 , Color);

  FColor := Value;
end;
Aber wie gesagt es wird nicht gehalten.

gruss

Geändert von EWeiss (22. Jun 2012 um 07:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: GDI+ Images zur Laufzeit austauschen

  Alt 22. Jun 2012, 05:51
Hallo Emil,

wahrscheinlich habe ich Dich falsch verstanden, was ich verstanden habe klingt als ob Du etwas in der Art meinst:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,PNGIMage, StdCtrls;

type
  TBMPArray=Array of TBitMap;
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
  FOrgPng:TPngImage;
  FBMPArray:TBMPArray;
  FCurrBMP:Integer;
  FYellowIndex:Integer;
  procedure NewBMP(g: TGraphic);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation
uses exGDIPapi,ExGDIPobj,EXGdi;
{$R *.dfm}

Procedure TForm2.NewBMP(g:TGraphic);
var
 bmp:TBitmap;
begin
  SetLength(FBMPArray,High(FBMPArray)+2);
  FCurrBMP := High(FBMPArray);
  bmp:=TBitmap.Create;
  bmp.Assign(g);
  FBMPArray[FCurrBMP] := bmp;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
 G:TGPGraphics;
 B:TGPSolidBrush;
begin
   NewBMP(FBMPArray[FCurrBMP]);
   FYellowIndex := FCurrBMP;
   G := GetGraphics(FBMPArray[FCurrBMP].Canvas);
   B:= GetSolidBrush(clYellow,200);
   try
     g.FillRectangle(b,MakeRect(10.0,10.,50,50));
   finally
     b.Free;
     G.Free;
   end;
   invalidate;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
 G:TGPGraphics;
 B:TGPSolidBrush;

begin
   if FYellowIndex>-1 then
      begin
         NewBMP(FBMPArray[FYellowIndex]);
         G := GetGraphics(FBMPArray[FCurrBMP].Canvas);
         B:= GetSolidBrush(clRed,200);
         try
           g.FillRectangle(b,MakeRect(20.0,10.,30,50));
         finally
           b.Free;
           G.Free;
         end;
         invalidate;
      end;
end;

procedure TForm2.Button3Click(Sender: TObject);
var
 G:TGPGraphics;
 B:TGPSolidBrush;

begin
         NewBMP(FBMPArray[0]);
         G := GetGraphics(FBMPArray[FCurrBMP].Canvas);
         B:= GetSolidBrush(clBlue,200);
         try
           g.FillRectangle(b,MakeRect(20.0,20.,30,50));
         finally
           b.Free;
           G.Free;
         end;
         invalidate;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
   FYellowIndex := -1;
   FORGPng := TPNGImage.Create;
   FORGPng.LoadFromFile('C:\Bilder\IconCollection\ix_ap_all\128x128\shadow\About.png');
   NewBMP(FORGPng);
end;

procedure TForm2.FormDestroy(Sender: TObject);
var
 i:Integer;
begin
  FORGPng.Free;
  for I := Low(FBMPArray) to High(FBMPArray) do FBMPArray[i].free;

end;

procedure TForm2.FormPaint(Sender: TObject);
begin
   Canvas.Draw(0,0,FBMPArray[FCurrBMP]);
end;

end.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: GDI+ Images zur Laufzeit austauschen

  Alt 22. Jun 2012, 07:03
Hi

Ich lade ein *.png File über ImageLoadFromFile und als rückgabe bekomme ich ein Gdip-Image
Danach zeichne ich ein Quadrat in die mitte des Images aber nach dem ersten WM_Paint
ist von dem Quadrat nichts mehr zu sehen.

Um das Image beizubehalten müßte ich es wahrscheinlich Bitblt so das ich eine Kopie von dem aktuellen Image mit Quadrat habe
Nun das problem wie bekomme ich dieses im Speicher ohne es abzuspeichern wieder ins Image Format..
So wie es eingeladen wird mit ImageLoadFromFile.

Danke für deine Unterstützung.

Das Shape in dem ich die Farbquadrate zeichne ist immer das selbe
Aber nicht in einem array die eigenschaften werden in propertys abgelegt
nur so am rande.

gruss

Geändert von EWeiss (22. Jun 2012 um 17:52 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: GDI+ Images zur Laufzeit austauschen

  Alt 22. Jun 2012, 17:53
Hat sich erledigt.

Funktioniert nun mit einem kleinen Hack.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:33 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