Autor |
Beitrag |
Nano-Ware
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: Mo 09.07.12 17:34
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
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Nano-Ware
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: Mo 09.07.12 17:42
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?
EDIT2: Kann es sein, dass Invalidate immer das Canvas löscht?
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
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
TomyN
Beiträge: 32
Erhaltene Danke: 2
Win10
D5 Std., Turbo-Delphi (w32), Delphi 2010
|
Verfasst: 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
|
|
|