2012-12-09 21 views
6

ho bisogno di disegnare alcune linee su una tela, ma ho bisogno di utilizzare uno stile personalizzato, nessuno stile standart come solido, dot, ...Tracciare una linea su tela con stile personalizzato (Delphi)

Per esempio ho bisogno traccia una linea come "__. __. _ " o ". _. _. _. _". Tutta la mia linea è un mix di trattini e punti e ho bisogno di impostare anche la lunghezza del trattino e il trattino, la larghezza del punto.

Non voglio utilizzare GDI + o altra libreria esterna ...

C'è un modo semplice per farlo?

+1

funzione ExtCreatePen permette di creare penna stile utente (con alcune limitazioni) – MBo

+1

possibile duplicato [E 'possibile modificare le dimensioni di un pizzico di una linea?] (http://stackoverflow.com/questions/3123667/is-it-possibile-per-cambiare-la-dimensione-di-una-una-una-una-una) –

+1

Pollice in giù a chi ha votato a chiudi questo ... –

risposta

8

È possibile farlo con la semplice 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. Molto bello e funziona bene. –

+0

Perché non posso modificare il parametro larghezza? Se lo cambio, ottengo sempre una linea continua con larghezza = 1 ... – Martin

+0

@ Martin: Penso che le penne cosmetiche GDI possano avere solo una larghezza unitaria. [doc] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd162705 (v = vs.85) .aspx) –

2

È inoltre possibile utilizzare l'API LineDDA. Sicuramente lo stile di penna (come consigliato da Andreas Rejbrand) è molto più veloce, ma LineDDA ti permetterà di disegnare le parti della linea in diversi colori.

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; 
Problemi correlati