2009-08-27 12 views
11

मुझे Graphics संदर्भित किसी भी डिवाइस पर एक इंच लंबी लाइन खींचने की आवश्यकता है। Transform पर सेट किए जाने के बावजूद मुझे इसे एक इंच लंबा होना चाहिए। आइए मान लें कि ट्रांसफॉर्म का स्केलिंग कारक scale दोनों क्षैतिज और लंबवत दिशाओं में दिया गया है।जीडीआई +: मैं उस रेखा को कैसे आकर्षित करूं जो किसी भी डिवाइस पर लम्बाई है?

कुछ C++/CLI कोड:

g->DrawLine(Pens::Black, 50.0f, 50.0f, 50.0f + oneInchEquivalent/scale, 50.0f); 

अब जब कि बिल्कुल मुश्किल नहीं था! अब हमें केवल oneInchEquivalent की गणना करने की आवश्यकता है।

g->DpiX मुझे स्क्रीन पर एक इंच की तरह दिखता है लेकिन प्रिंटर पर नहीं देता है। ऐसा लगता है कि प्रिंटर पर, ग्राफिक्स यूनिट :: डिस्प्ले पर सेट g->PageUnit के साथ 100 इकाइयों की एक रेखा खींचना मुझे एक इंच लंबी लाइन देगी। लेकिन, PageUnit सेटिंग के बावजूद मुझे वास्तव में काम करने की आवश्यकता है। वास्तव में, PageUnit बदलना कलम की चौड़ाई बदल देगा !!

संपादित करें: मैंने यहां केवल एकमात्र उत्तर स्वीकार कर लिया है क्योंकि यह जो कुछ मैं ढूंढ रहा हूं उसके करीब है।

+0

मैंने एक प्रिंट नमूना –

उत्तर

12

जवाब बल्कि संपादन के एक जोड़े के बाद लंबे समय से बन गया है, इसलिए यहाँ अंतिम परिणाम है:

GraphicsUnit.Pixel करने के लिए Graphics वस्तु की PageUnit गुण को सेट और DpiX और DpiY मूल्यों के साथ निर्देशांक गुणा प्रदान करेगा में ले जा रही है प्रदर्शन और प्रिंटर उपकरणों दोनों पर अपेक्षित परिणाम।

private static void DrawInchLine(Graphics g, Color color, Point start, Point end) 
{ 
    GraphicsUnit originalUnit = g.PageUnit; 
    g.PageUnit = GraphicsUnit.Pixel; 
    using (Pen pen = new Pen(color, 1)) 
    { 
     g.DrawLine(pen, 
      start.X * g.DpiX, 
      start.Y * g.DpiY, 
      end.X * g.DpiX, 
      end.Y * g.DpiY); 
    } 
    g.PageUnit = originalUnit; 
} 

आप इसे एक फॉर्म (या कुछ नियंत्रण) पर पेंट कर सकते हैं:

using (Graphics g = this.CreateGraphics()) 
{ 
    Point start = new Point(1, 1); 
    Point end = new Point(2, 1); 
    DrawInchLine(g, Color.Black, start, end); 
} 

... या एक प्रिंटर से उत्पादन भेजें:

PrintDialog dialog = new PrintDialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    PrintDocument pd = new PrintDocument(); 
    pd.PrinterSettings = dialog.PrinterSettings; 
    pd.PrintPage += (psender, pe) => 
    { 
     Point start = new Point(1, 1); 
     Point end = new Point(2, 1); 
     DrawInchLine(pe.Graphics, Color.Black, start, end); 
     pe.HasMorePages = false; 
    }; 

    pd.Print(); 
} 

यह करता है, लेकिन , PageUnit सेट करने पर भरोसा करें।

+0

के साथ अपना जवाब अब अपडेट किया है आप प्रिंटर एमुलेटर के लिए प्यारा पीडीएफ आज़मा सकते हैं। आप वहां मतभेद देख सकते हैं। –

+0

मुझे अभी एहसास हुआ कि मेरे पास एक प्रिंटर खड़ा है; इसे मुद्रित करने की कोशिश की; बिल्कुल एक इंच में बाहर आया। कोड के साथ अद्यतन होगा। –

+0

धन्यवाद फ्रेड्रिक, लेकिन मुझे PageUnit सेटिंग को बदले बिना अकेले गणित का उपयोग करके ऐसा करने की ज़रूरत है। पेजनिट बदलना कलम की चौड़ाई को प्रभावित करेगा। मेरे प्रश्न का अंतिम भाग देखें। –

संबंधित मुद्दे