Geglättete, dicke Linien zeichnen
Auf Anfrage eines DF-Mitglieds habe ich eine kleine Klasse (
TPaintBoxEx) geschrieben, welche ähnlich wie
TPaintBox ist. Auf Anfrage eines anderen DF-Mitglieds veröffentliche ich die Routinen hier.
Im Gegensatz zu
TPaintBox wird das gezeichnete Bild bei
TPaintBoxEx gepuffert und flimmerfrei angezeigt. Die Komponente ist fokusierbar und enthält einige Zeichenroutinen wie
DrawLineAA (zeichnen von geglätteten Linien) und schneller Pixel-Zugriff via
Pixels[].
Nach einem Zugriff auf
TPaintBoxEx ist stets ein
Invalidate (bzw.
Repaint) erforderlich, um das Bild zu aktualisieren.
Das ganze ist nicht so sauber programmiert, wie es sein könnte; für die meisten Zwecke sollte es aber eigentlich reichen.
Beispiel 1 (geglättete, dicke Linien Zeichnen -- siehe Screenshot):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| const N = 24; var I: Integer; p: Single; begin for I := 0 to N-1 do with PaintBox1, CanvasBuffer do begin p := I/N*pi*2; Pen.Style := psDot; Pen.Color := clBlue; Pen.Width := 2; DrawLineAA(20*cos(p)+200,20*sin(p)+200,200*cos(p)+200,200*sin(p)+200); Pen.Style := psDashDotDot; Pen.Color := clRed; Pen.Width := 8; DrawLineAA(20*cos(p)+250,20*sin(p)+200,200*cos(p)+250,200*sin(p)+200); end; PaintBox1.Invalidate; end; |
Beispiel 2 (schneller Pixel-Zugriff):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var x, y: Integer; begin with PaintBoxEx1 do for y := 0 to 255 do for x := 0 to 255 do Pixels[x,y] := Ord(x and y = 0)*clRed;
PaintBoxEx1.Invalidate; end; |
Siehe auch:
Hier ist ein alter Post mit einer anderen Routine für geglättete Linien.
Die Linienroutinen basieren auf Ausführungen von
dieser Seite.
//Edit: Exe entfernt, Beispiele und Erläuterungen hinzugefügt.