Hi halinchen,
@ Sunlight7: Vorsicht, TWincontrol besitzt keinen Canvas. Der ist erst ab TCustomcontrol dabei.
@ Halinchen:
Ich würde an deiner Stelle nicht auf dem Canvas des Parents malen. Sicher ist das Ansichtssache, aber mit einer visuellen Componente ist das Platzieren meiner Meinung nach einfacher. Somit würde ich die Kompo folgendermaßen aufbauen:
Delphi-Quellcode:
unit Line;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TLine =
class(TCustomControl)
private
A,E:TPoint;
//Anfang+Ende
W:Integer;
//Width
C:TColor;
//Color
Can:TCanvas;
//Canvas
{ Private-Deklarationen }
protected
{ Protected-Deklarationen }
procedure Draw;
procedure Paint;
override;
public
{ Public-Deklarationen }
published
property X1:Integer
read A.X
write A.X;
property X2:Integer
read A.Y
write A.Y;
property Y1:Integer
read E.X
write e.X;
property Y2:Integer
read E.Y
write E.Y;
property Witdth:integer
read W
write W;
property Color:TColor
read C
write C;
property Canvas:TCanvas
read Can
write Can;
{ Published-Deklarationen }
end;
procedure Register;
implementation
procedure Tline.Draw;
begin
self.canvas.PenPos := A;
self.canvas.Pen.Width := W;
self.canvas.Pen.Color := C;
self.canvas.LineTo(E.X,E.Y);
end;
procedure Register;
begin
RegisterComponents('
Zusätzlich', [TLine]);
end;
procedure TLine.Paint;
begin
inherited;
Draw;
end;
end.
o.k., jetzt gibt das natürlich wenig Sinn mit den Koordinaten. so lange du hier keine Polygone zeichen möchtest, die du in einer Funktion abbilden kannst, reicht es hier eine Eigenschaft für die Linienart aufzunehmen. In einer visuellen Kompo nimmst du als koordinaten dann die entsprechenden eigenen Dimensionen wie self.left usw.
Bsp.:
Delphi-Quellcode:
type
TLineType = (ltNone, // keine Linie
ltLeft, // Linie links
ltRight, // Linie rechts
ltTop, // Linie oben
ltBottom, // Linie unten
ltVCenter, // Mitte vertikal
ltHCenter // Mitte horizontal
);
Hier kannst du dann auch noch weitere typen aufnehmen wie Diagonalen usw.
weitere Eigenschaften für Linienenden (Pfeile, kreise ...) kannst du natürlich genauso einbinden. Diverse Graphikprogramme bitten da einen guten Überblick über probate Linieneigenschaften (vorallem vektor orientierte wie CorelDraw usw.).
In deiner Draw Methode kannst du dann mit Case of in die entsprechenden Zeichenmethoden verzweigen.
Gruß oki