2012-12-09 8 views
6

मैं एक कैनवास पर कुछ रेखाएँ खींचें की जरूरत के साथ कैनवास पर एक लाइन खींचें, फिर भी मैं एक कस्टम शैली, ठोस, डॉट के रूप में कोई standart शैली, का उपयोग की आवश्यकता है ...उदाहरण मैं जरूरत के लिए कस्टम शैली (डेल्फी)

"__। __। _ " या "" _। _। _। _ "के रूप में एक रेखा खींचना। मेरी सारी लाइन डैश और डॉट का मिश्रण है और मुझे भी सेट लांच और डैश, डॉट चौड़ाई सेट करने की आवश्यकता है।

मैं उपयोग GDI + या अन्य बाहरी पुस्तकालय नहीं चाहता ...

वहाँ यह करने के लिए एक आसान तरीका है?

+1

ExtCreatePen समारोह (कुछ सीमाओं के साथ) उपयोगकर्ता शैली कलम की [ – MBo

+1

संभव डुप्लिकेट का एक पानी का छींटा का आकार बदलने के क्या यह संभव है बनाने की अनुमति देता एक लाइन?] (http://stackoverflow.com/questions/3123667/is-it-possible-to-change-the-size-of-a-dash-of-a-line) –

+1

जो भी मतदान करने के लिए नीचे गिरता है इसे बंद करें ... –

उत्तर

8

आप सादे 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। बहुत अच्छा है, और अच्छी तरह से काम करता है। –

+0

मैं चौड़ाई पैरामीटर क्यों नहीं बदल सकता? अगर मैं इसे बदलता हूं तो मुझे हमेशा चौड़ाई = 1 के साथ एक ठोस रेखा मिलती है ... – Martin

+0

@ मार्टिन: मुझे लगता है कि जीडीआई कॉस्मेटिक पेन में केवल इकाई चौड़ाई हो सकती है। [डॉक्टर] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd162705 (v = vs.85) .aspx) –

2

आप LineDDA API का भी उपयोग कर सकते हैं। निश्चित रूप से पेन स्टाइल (जैसा कि एंड्रियास रेजब्रांड द्वारा सलाह दी गई है) बहुत तेज है, लेकिन लाइनडीडीए आपको विभिन्न रंगों में रेखा के हिस्सों को आकर्षित करने की अनुमति देगा।

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; 
संबंधित मुद्दे