![]() |
GDI+ Images zur Laufzeit austauschen
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:
Aber wie gesagt es wird nicht gehalten.
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; gruss |
AW: GDI+ Images zur Laufzeit austauschen
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. |
AW: GDI+ Images zur Laufzeit austauschen
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 |
AW: GDI+ Images zur Laufzeit austauschen
Hat sich erledigt.
Funktioniert nun mit einem kleinen Hack. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 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