2014-10-06 3 views
5

मैं बार-बार नियंत्रण क्षेत्र पर कुछ ग्राफिक्स खींच रहा हूं, और हर बार जब मैं एक पारदर्शी पृष्ठभूमि के साथ ताजा शुरू करना चाहता हूं। तो मैं उपयोग करता हूं:सी # ग्राफिक्स। क्लीयर (रंग। ट्रांसपेरेंट) ठीक से काम नहीं कर रहा है?

Graphics graph = control.CreateGraphics(); 
graph.Clear(Color.Transparent); 

हालांकि, ग्राफिक्स क्षेत्र पारदर्शी के बजाय काला हो जाता है। कोई विचार?

+2

साफ़ रंग जैसे ग्राफिक्स फ़ंक्शंस अनिवार्य रूप से नो-ऑप्स होते हैं जब 'रंग। ट्रांसपेरेंट' के साथ उपयोग किया जाता है। 'ग्राफिक्स। क्लेयर (रंग। ट्रांसपेरेंट)' का मतलब यह नहीं है कि "ऐसा करें कि मेरी पूरी ग्राफिक्स स्पेस पारदर्शी है"। इसके बजाय, इसका मतलब है, "मेरे वर्तमान स्थान पर रंग 'पारदर्शी' चित्रित करके मेरी पूरी ग्राफिक्स स्पेस को साफ़ करें"। –

+0

यह निदान करने के लिए कि यह काला क्यों जा रहा है, हमें अधिक जानकारी की आवश्यकता हो सकती है। क्या यह पेंट इवेंट हैंडलर में कस्टम नियंत्रण में है? क्या आप कोई कंट्रोल स्टाइल सेट कर रहे हैं? –

+0

और अपने ऑन-ऑन 'ऑनपेंट' ओवरराइड में दर्द करें ... 'CreateGraphics' से बचें ... यह बुरा है। – DonBoitnott

उत्तर

2

मुझे जो चाहिए उसे प्राप्त करने के लिए मुझे एक वैकल्पिक तरीका मिला। मैं नियंत्रण के आयामों के साथ एक नया पारदर्शी बिटमैप बनाने के लिए, उस पर मेरा सामान आकर्षित और फिर नियंत्रण के लिए एक पृष्ठभूमि छवि के रूप में उपयोग:

Bitmap bitmap = new Bitmap(control.Width, control.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
    bitmap.MakeTransparent(); 
    Graphics graph = Graphics.FromImage(bitmap); 

    // draw stuff here ... 

    control.BackgroundImage = bitmap; 
    graph.Dispose(); 

यह पूरी तरह से काम करता है।

+1

यदि आप ऑब्जेक्ट्स बनाने के लिए कथन का उपयोग करने के साथ काम कर रहे हैं, तो यह बेहतर है, जो आईडीस्पोजेबल इंटरफ़ेस को कार्यान्वित करता है। इसका बड़ा लाभ यह है कि आपको अपनी वस्तुओं का निपटान करने की आवश्यकता नहीं है। तो क्लीनर कार्यान्वयन के लिए ग्राफिक्स ग्राफ = ग्राफिक्स.फ्रॉम इमेज (बिटमैप); से (ग्राफ़िक्स ग्राफ = ग्राफिक्स.फ्रॉम इमेज (बिटमैप)) { // यहां ड्रॉ सामान ... नियंत्रण। बैकग्राउंड इमेज = बिटमैप; } – Dom84

+0

मेरे मामले में, मुझे यह भी करने के लिए 'ग्राफ' क्लीयर (रंग। ट्रांसपेरेंट) करने की आवश्यकता है। लेकिन आपके उत्तर के लिए धन्यवाद! –

0

क्योंकि तस्वीरबॉक्स में पारदर्शिता परत नहीं है। आप स्थानांतरण बिटमैप का उपयोग कर सकते हैं। इसे आजमाएं।

 tmp_bmp = new Bitmap(picturebox1.Width, picturebox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     Graphics Canvas = Graphics.FromImage(tmp_bmp); 
     picturebox1.Image = tmp_Type; 

     Type_Canvas.Clear(Color.Transparent); 
संबंधित मुद्दे