2012-12-09 14 views
6

Ich brauche ein paar Zeilen auf einer Leinwand zu zeichnen, aber ich brauche einen benutzerdefinierten Stil verwenden, keinen standart Stil als solider, punkt, ...Zeichnen Sie eine Linie auf Leinwand mit benutzerdefiniertem Stil (delphi)

Zum Beispiel ich brauche Zeichnen Sie eine Zeile als "__. __. _ " oder ". _. _. _. _". Alle meine Linien sind eine Mischung aus Strich und Punkt und ich brauche auch Strich Länge und Strich, Punktbreite.

Ich benutze keine GDI wollen + oder andere externe Bibliothek ...

Gibt es eine einfache Möglichkeit, es zu tun?

+1

ExtCreatePen Funktion ermöglicht es den Benutzer Stil Stift (mit einigen Einschränkungen) – MBo

+1

möglich Duplikat [Ist es möglich, ändern Sie die Größe eines Strich zu erstellen eine Linie?] (http://stackoverflow.com/questions/3123667/isit-possible-to-change-the-size-of-a-dash-of-a-line) –

+1

Daumen runter zu wem auch immer gewählt schließe das ... –

Antwort

8

Sie können dies mit einfacher GDI:

procedure TForm1.FormPaint(Sender: TObject); 
const 
    pattern: array[0..3] of cardinal = (10, 1, 1, 1); 
var 
    lb: TLogBrush; 
    pen, oldpen: HPEN; 
begin 
    lb.lbStyle := BS_SOLID; 
    lb.lbColor := RGB(255, 0, 0); 
    pen := ExtCreatePen(PS_COSMETIC or PS_USERSTYLE, 1, lb, length(pattern), @pattern); 
    if pen <> 0 then 
    try 
     oldpen := SelectObject(Canvas.Handle, pen); 
     Canvas.MoveTo(0, 0); 
     Canvas.LineTo(ClientWidth, ClientHeight); 
     SelectObject(Canvas.Handle, oldpen); 
    finally 
     DeleteObject(pen); 
    end; 
end; 
+1

+1. Sehr nett und funktioniert gut. –

+0

Warum kann ich den Breitenparameter nicht ändern? Wenn ich es ändere, bekomme ich immer eine durchgezogene Linie mit Breite = 1 ... – Martin

+0

@Martin: Ich denke, GDI Kosmetikstifte können nur Einheitsbreite haben. [doc] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd162705 (v = vs.85) .aspx) –

2

Sie können auch LineDDA API verwenden. Sicher ist das Pen-Styling (wie von Andreas Rejbrand empfohlen) viel schneller, aber LineDDA erlaubt es Ihnen, die Teile der Linie in verschiedenen Farben zu zeichnen.

var 
    DottedLineDrawCounter: Integer; 

procedure DDAProc(AX, AY: Integer; ACanvas: TCanvas); stdcall; 
begin 
    if DottedLineDrawCounter mod 4 = 0 then 
    ACanvas.Pixels[AX, AY] := clRed 
    else 
    ACanvas.Pixels[AX, AY] := clBlack; 
    Inc(DottedLineDrawCounter); 
end; 

... 
begin 
    // Usage 
    DottedLineDrawCounter := 0; 
    LineDDA(X1, Y1, X2, Y2, @DDAProc, LPARAM(Canvas)); 
end;