2010-07-07 23 views
5

मुझे यकीन नहीं है कि ग्राफिक्स का उपयोग करने का सबसे अच्छा तरीका क्या है - क्या मुझे अपनी कक्षाओं को मुख्य रूप पेंट इवेंट में संलग्न करना चाहिए और फिर ड्राइंग करना चाहिए, या इसे ओवरडेंट ऑनपेंट शून्य से कॉल करना बेहतर है इस? मेरा मतलब है, यह ठीक है कि ऐसा करने के लिए इस तरह है:सी # WinForms - पेंट विधि प्रश्न

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e) //what is this good for? My app works without it as well 
    Graphics g=e.Graphics; 
    DrawEnemies(g); 
    UpdateHUD(g); 
    DrawSelectedUnit(g); 
} 
+4

'ऑनपेन' संकलन नहीं करेगा, जब तक कि यह वास्तव में एक वर्ग का उप-वर्ग नहीं है जो शारीरिक रूप से अत्याचार का समर्थन करता है;) – Thomas

+2

Aw @ थॉमस, आप इसे संपादित कर सकते थे। – Lazarus

+1

नहीं। मैं इसके लिए बहुत विनोदी हूँ। (इसके अलावा, मुझे हाल ही में किसी के कोड में एक स्पष्ट प्रतिलिपि/पेस्ट गलती संपादित करने के लिए झुकाया गया था, लेकिन यह कारण नहीं था कि मैंने यहां संपादन से बचना चाहिए।) – Thomas

उत्तर

6

यह अनुशंसित है कि नियंत्रण On... तरीकों को ओवरराइड करने के बजाय अपने खुद के घटनाओं की सदस्यता लें।

Paint विधि को ठीक से निकाल दिया गया है, तो आपको base.OnPaint पर कॉल करना चाहिए।

From MSDN:

OnPaint विधि भी एक प्रतिनिधि संलग्न बिना घटना संभाल करने व्युत्पन्न वर्ग सक्षम बनाता है। यह को व्युत्पन्न कक्षा में ईवेंट को संभालने के लिए पसंदीदा तकनीक है।

नोट्स
उत्तराधिकारियों के लिए जब एक व्युत्पन्न वर्ग में OnPaint ओवरराइड करना, ताकि पंजीकृत प्रतिनिधियों घटना प्राप्त कॉल आधार वर्ग के OnPaint विधि कर लें।

+0

आमतौर पर, ऑनपेंट को ओवरराइड करने के लिए आपको अब पेंट घटनाओं को आग लगाने की आवश्यकता नहीं है, इसलिए आधार। ऑन पेंट अनिवार्य नहीं है। एमएसडीएन बताता है, लेकिन सबकुछ ठीक से पालन नहीं करना है। इसी तरह आप ऑनबैकग्राउंड पेंट को ओवरराइड करते हैं और बेस पर टिप्पणी करते हैं। ऑनबैकग्राउंड पेंट पृष्ठभूमि को पुन: चित्रित नहीं करते - झिलमिलाहट के खिलाफ। – serhio

+0

@ सेरियियो: पृष्ठभूमि चित्रकला को रोकने का तरीका ऑनबैकग्राउंडपेंट को ओवरराइड नहीं करना है (यह पुराना स्कूल ब्रूट फोर्स विधि Win32 से लिया गया है)। इसके बजाय, आपको 'AllPaintingInWmPaint' को शामिल करने के लिए नियंत्रण शैली सेट करनी चाहिए। –

+0

एमएसडीएन से: 'एक व्युत्पन्न कक्षा में ऑनपेंटबैकग्राउंड को ओवरराइड करते समय बेस क्लास के ऑनपेंटबैकग्राउंड को कॉल करना आवश्यक नहीं है। Http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaintbackground। एएसपीएक्स – serhio

3

इससे कोई फर्क नहीं पड़ता; दोनों कार्य। OnPaint ओवरराइडिंग सिद्धांत में इतनी तेज हो सकती है, लेकिन यह कोई फर्क नहीं पड़ता कि कोई भी नोटिस करेगा। माइक्रोसॉफ्ट OnPaint ओवरराइड करने की सिफारिश करता है लेकिन वास्तव में इसे प्रेरित नहीं करता है।

आपको base.OnPaint पर कॉल करने की आवश्यकता है क्योंकि यह विधि Paint ईवेंट से जुड़े हैंडलर को आमंत्रित करेगी।

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