2013-05-28 6 views
5

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

private void pnlViewer_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.TranslateTransform(pnlViewer.AutoScrollPosition.X, pnlViewer.AutoScrollPosition.Y); 
    e.Graphics.FillRectangle(Brushes.Black, Screen.PrimaryScreen.Bounds); 
    //**draw Y Axis** 
    int y; 
    for (int i = 0; i <= 50; i++) 
    { 
     y = (i * cellHeight) + cellHeight; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(0, y), new Point(pageWidth, y)); 
    } 
    //**draw X Axis** 
    int x; 
    for (int i = 0; i < 50; i++) 
    { 
     x = (i * cellWidth) + ribbonWidth; 
     e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
          new Point(x, 0), new Point(x, pageHeight)); 
    } 
    DrawWaveForm(e.Graphics); **// Here the actual data of graph will draw** 
} 

जब मैं एक WinForm पर उपयोगकर्ता नियंत्रण इस खींचें, यह विंडोज़ रूप से उपयोगकर्ता नियंत्रण के इस रंग घटना कहता है, लेकिन इस इवेंट से बुला ग्राफ दिखाया गया है, लेकिन कुछ समय के बाद ग्राफ खाली हो जाता है।

मैंने Invalidate(true), Update(), Refresh() इस तरह की सभी विधियों का प्रयास किया लेकिन उनका कोई उपयोग नहीं था।

असल में यह आकृति के आधे ग्राफ को दिखाता है और उसके बाद उसी पेंट इवेंट को निकाल दिया जाता है, तो यह मुझे पूरा ग्राफ दिखाता है, लेकिन वास्तव में मैं पूर्ण ग्राफ दिखाते हुए आधा ग्राफ के बजाय पहले पेंट इवेंट पर चाहता हूं।

+3

कैसे आप() 'एक' Graphics' वस्तु गुजर बिना 'DrawWaveForm में आकर्षित करते हैं? – Andy

+0

@Andy क्षमा करें, मैं इसे अपनी मूर्खतापूर्ण गलती दिखाने के लिए धन्यवाद जोड़ना भूल गया हूं, कोड को फिर से अपडेट करें ........ –

+0

क्या यह गलती को सही करके हल किया गया है? –

उत्तर

3
e.Graphics.DrawLine(new Pen(Color.FromArgb(50, 50, 50)), 
         new Point(0, y), new Point(pageWidth, y)); 

आप सिस्टम का निपटारा नहीं कर रहे हैं। इस कोड में ऑब्जेक्ट ड्रॉइंग। संभवतः अन्य कोड में भी। यह लंबे समय तक अनजान हो सकता है, कचरा कलेक्टर समस्या को छिपाने के लिए जाता है। लेकिन अगर यह अक्सर पर्याप्त नहीं चलता है तो ऑपरेटिंग सिस्टम आपके बारे में बहुत सारे जीडीआई हैंडल का उपयोग करके सुस्त हो सकता है और यह आपके प्रोग्राम को उनमें से कोई भी बनाने की अनुमति नहीं देगा। कोटा 10,000 हैंडल है, एक बहुत बड़ी संख्या है लेकिन अगर आप अक्सर पेंट करते हैं तो आसानी से उपभोग किया जाता है। विशिष्ट उदाहरण के लिए जब आप लगातार अद्यतन ग्राफ खींचते हैं। आगे क्या होता है, अपवाद के बीच कहीं और यह देखते हुए कि आपका प्रोग्राम अब और सही ढंग से पेंट नहीं करता है।

हमेशा चित्रकला कोड में का उपयोग कर कथन का उपयोग इस विफलता मोड से बचने के लिए:

using (var pen = new Pen(Color.FromArgb(50, 50, 50))) { 
    e.Graphics.DrawLine(pen, new Point(0, y), new Point(pageWidth, y)); 
} 
संबंधित मुद्दे