2009-06-03 14 views
5

मैं एक पैनल पर एक पाठ खींचने की कोशिश कर रहा हूं (पैनल में पृष्ठभूमि चित्र है)।पैनल पर खींचा गया पाठ गायब क्यों होता है?

यह शानदार काम करता है, लेकिन जब मैं कम करता हूं और फिर एप्लिकेशन को अधिकतम करता हूं तो पाठ समाप्त हो जाता है।

मेरे कोड:

using (Graphics gfx = Panel1.CreateGraphics()) 
{ 
    gfx.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 

मैं इसे कैसे स्थिर रहते हो तो यह खो जाना नहीं करता है?

उत्तर

2

यदि आप Paint ईवेंट का उपयोग नहीं करते हैं, तो आप केवल उस स्क्रीन पर आरेखण कर रहे हैं जहां नियंत्रण होता है। नियंत्रण इस बारे में अवगत नहीं है, इसलिए यह नहीं पता कि आप पाठ के लिए वहां रहना चाहते हैं ...

यदि आप उस मान को डालते हैं जिसे आप पैनल पर Tag संपत्ति में खींचना चाहते हैं, तो आप इसका उपयोग कर सकते हैं सभी पैनलों के लिए एक ही पेंट इवेंट हैंडलर।

इसके अलावा, आपको फ़ॉन्ट ऑब्जेक्ट का सही ढंग से निपटान करने की आवश्यकता है, या आप उनमें से बहुत से सिस्टम को अपने संसाधनों को वापस करने से पहले अंतिम रूप देने की प्रतीक्षा कर रहे हैं।

private void panel1_Paint(object sender, PaintEventArgs e) { 
    Control c = sender as Control; 
    using (Font f = new Font("Tahoma", 5)) { 
     e.Graphics.DrawString(c.Tag.ToString(), f, Brushes.White, new PointF(1, 1)); 
    } 
} 
4

बस पेंट घटना के लिए एक हैंडलर जोड़ने:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawString("a", new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
} 
+0

ठीक है, मैंने सब कुछ नहीं कहा। मेरे पास 62 पैनल हैं और मुझे उनमें से प्रत्येक पर अलग-अलग पूर्णांक लिखना है, क्या कोई दूसरा विकल्प है या आप यह कैसे सुझाव देंगे कि ऐसा किया जाए? –

+0

@ जॉन: मैं एक नियंत्रण बनाने का सुझाव दूंगा जो पैनल से विरासत में है, और पाठ के लिए एक संपत्ति बना रहा है। स्ट्रिंग लिखने के लिए अपने नियंत्रण में ऑनपेंट को ओवरराइड करें (उसी कोड का उपयोग करके)। –

+0

हां, लेकिन इसका मतलब है 60 ऑनपेंट घटनाएं - हाथ से। :( –

0

जब आप कुछ आकर्षित, यह केवल अगली बार प्रपत्र ताजा है जब तक बनी हुई है।

जब फॉर्म रीफ्रेश किया जाता है, तो पेंट इवेंट कहा जाता है। इसलिए यदि आप यह सुनिश्चित करना चाहते हैं कि आपका टेक्स्ट गायब न हो, तो आपको उस पेंट इवेंट में खींचने वाले कोड को शामिल करने की आवश्यकता है।

आप Control.Invalidate का उपयोग करके एक पेंट ट्रिगर कर सकते हैं, लेकिन अन्यथा आप भविष्यवाणी नहीं कर सकते कि वे कब होंगे।

कक्ष से
+0

नई समस्या यह है कि मुझे "ए" लिखना नहीं है, लेकिन एक विशिष्ट पूर्णांक और पैनल एक नहीं है, क्या पेंटवेन्ट इसे पूरा करने का एकमात्र तरीका है? –

+0

इसे एक संपत्ति बनाएं अपनी कक्षा और बस ऑनपेंट में कहा संपत्ति का मूल्य खींचें। –

9

इनहेरिट, एक संपत्ति है कि पाठ आप लिखने की ज़रूरत का प्रतिनिधित्व करता है OnPaintMethod() जोड़ने के लिए, और ओवरराइड:

public class MyPanel : Panel 
{ 
    public string TextToRender 
    { 
     get; 
     set; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.DrawString(this.TextToRender, new Font("Tahoma", 5), Brushes.White, new PointF(1, 1)); 
    } 
} 

इस तरह, प्रत्येक पैनल पता चलेगा कि कौन यह रेंडर करने के लिए जरूरत है, और पता चल जाएगा खुद को पेंट कैसे करें।

+0

+1: इसे सेकंड तक मुझे मारो :) –

+0

सिर्फ एक प्रश्न, क्या मुझे "TextToRender =" myText "" कॉल करना चाहिए या यह स्वयं ही प्राप्त होगा? –

+1

जॉन: आपको myPanel1.TextToRender = "a" सेट करने की आवश्यकता होगी; myPanel2.TextToRender = "बी"; इसके अलावा, वे "9" काम करेंगे " –

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