Entwickler-Ecke
Multimedia / Grafik - GDI+ Dauernd neue Instanzen
Nano-Ware - Mo 09.07.12 17:34
Titel: GDI+ Dauernd neue Instanzen
Hey,
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.FormCreate(Sender: TObject); begin pen := TGPPen.Create(TGPColor.Create(255,0,0,0)); xx:= 0; YY := 0; end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin grafik := TGPGraphics.Create(Canvas.Handle); pen.Color := TGPColor.Create(255,255,255,255); grafik.DrawLine(pen,0,0,XX,YY); pen.Color := TGPColor.Create(255,0,0,0); grafik.DrawLine(pen,0,0,X,Y); XX := X; YY := Y;
end; |
Im code steht alles. Ich weiß nicht woran es liegt, aber es flackert, dass man Augenkrebs bekommt.
bummi - Mo 09.07.12 17:39
Male im OnPaint, rufe Invalidate da auf wo neu gemalt werden soll.
TGPGraphics muß ständig neu erzeugt werden weil sich das Canvas.Handle ändert
es muss aber auch wieder freigegeben werden, es sei denn Du hast die Interfaced Version.
DoubleBuffered auf True setzen.
Nano-Ware - Mo 09.07.12 17:42
http://www.bilsen.com/gdiplus/index.shtml
Ich versuche mal das mit dem OnPaint und editiere dann das hier..
EDIT: Cool habs jetzt so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin X1 := X; Y1 := Y; Invalidate; XX := X; YY := Y;
end;
procedure TForm1.FormPaint(Sender: TObject); begin grafik := TGPGraphics.Create(Canvas.Handle); grafik.SmoothingMode := SmoothingModeAntiAlias; pen.Color := TGPColor.Create(255,255,255,255); grafik.DrawLine(pen,0,0,X1,Y1); pen.Color := TGPColor.Create(255,0,0,0); grafik.DrawLine(pen,0,0,XX,YY);
end; |
Und es flackert sogar mit Antialiasing nicht mehr. Auf der Seite, von der ich die Lib hab steht, dass Delphi das Objekt selbstständig freigibt. Meine Methode ist jetzt relativ umständlich. Kann man das auch einfacher machen?
Außerdem, warum flackert es hier nicht? :D
EDIT2: Kann es sein, dass Invalidate immer das Canvas löscht?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure TForm1.FormCreate(Sender: TObject); begin pen := TGPPen.Create(TGPColor.Create(255,0,0,0)); xx:= 0; YY := 0; end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin down := true; X1 := X; Y1 := Y; end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Invalidate; XX := X; YY := Y;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin down := false; end;
procedure TForm1.FormPaint(Sender: TObject); begin if down then begin grafik := TGPGraphics.Create(Canvas.Handle); grafik.SmoothingMode := SmoothingModeAntiAlias; pen.Color := TGPColor.Create(255,0,0,0); grafik.DrawLine(pen,X1,Y1,XX,YY); end;
end; |
Denn die Linien sollten eigentlich erhalten bleiben.. o:
bummi - Mo 09.07.12 18:01
Die Informationen was gemalt werden soll musst Du getrennt verwalten, in Deinem Fall langen einfache Arrays.
Wenn Du persistent arbeiten willst legst Du ein TImage auf das Form (align=alClient), die Events(Mouse etc) hängts Du an das Image und als Canvas übergibst Du das Canvas des Images (angefangen haben wahrscheinlich die meisten mit Images oder Bitmaps).
Wenn Du mehr Übung hast und mit komplexeren Formen / Drehung /Zoom / Undo etc. arbeitest wirst Du wieder mit nicht persistenten HDC's arbeiten.
TomyN - Do 19.07.12 07:03
Hi,
sobald die Malaufgabe etwas komplexer wird ist es üblich, auf eine Speicherbitmap/Bild zu malen (hier eine GPBitmap) und diese dann komplett auszugeben.
Tomy
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!