.net - मैं WinForms में किसी पैनल की अस्पष्टता या पारदर्शिता कैसे सेट कर सकता हूं?




transparency panel opacity (9)

मैं सोच रहा था कि सी # में किसी पैनल की पारदर्शिता को कैसे बदलना या संशोधित करना, पूरे फॉर्म पर नहीं, बल्कि पैनल .. मैंने ओपेसिटी पर कई सी # ट्यूटोरियल देखे हैं, लेकिन यह फॉर्म के लिए है। मैं केवल पैनल के साथ यह कैसे संभव हो सकता है के लिए देख रहा हूँ। धन्यवाद!


Answers

हां, अस्पष्टता केवल शीर्ष-स्तरीय विंडो पर काम कर सकती है। यह वीडियो एडाप्टर की एक हार्डवेयर सुविधा का उपयोग करता है, जो कि पैनल की तरह विंडोज़ विंडो का समर्थन नहीं करता है। Winforms में एकमात्र शीर्ष-स्तरीय नियंत्रण व्युत्पन्न वर्ग फॉर्म है।

'शुद्ध' विनफॉर्म नियंत्रणों में से कई, जो मूल विंडोज नियंत्रण को नौकरी करने के बजाए अपनी खुद की पेंटिंग करते हैं, फिर भी एक पारदर्शी बैककोलर का समर्थन करते हैं। पैनल उनमें से एक है। यह एक चाल का उपयोग करता है, यह माता-पिता से पृष्ठभूमि पिक्सल का उत्पादन करने के लिए खुद को आकर्षित करने के लिए कहता है। इस चाल का एक दुष्प्रभाव यह है कि ओवरलैपिंग नियंत्रण काम नहीं करते हैं, आप केवल पैरेंट पिक्सेल देखते हैं, न कि ओवरलैप किए गए नियंत्रण।

यह नमूना फॉर्म इसे काम पर दिखाता है:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.BackColor = Color.White;
        panel1.BackColor = Color.FromArgb(25, Color.Black);
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
    }
}

यदि यह पर्याप्त नहीं है तो आपको एक दूसरे के शीर्ष पर रूपों को ढेर करने पर विचार करना होगा। इस तरह

उल्लेखनीय है कि यह प्रतिबंध विंडोज 8 में उठाया गया है। यह अब वीडियो एडेप्टर ओवरले फीचर और डीडब्लूएम (उर्फ एयरो) का उपयोग नहीं कर सकता है। जो लागू करने में आसान बाल खिड़कियों पर अस्पष्टता / पारदर्शिता बनाता है। इस पर निर्भर होने के लिए आने वाले समय के लिए निश्चित रूप से भविष्य-संगीत है। विंडोज 7 अगला एक्सपी होगा :)


http://www.windows-tech.info/3/53ee08e46d9cb138.php पर मिली जानकारी के आधार पर, मैं निम्नलिखित कोड का उपयोग करके पारदर्शी पैनल नियंत्रण प्राप्त करने में सक्षम था।

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
    }
}

चेतावनी यह है कि पैनल में जोड़े गए किसी भी नियंत्रण में अपारदर्शी पृष्ठभूमि होती है। फिर भी, मेरे WinForms एप्लिकेशन के हिस्सों को अवरुद्ध करने के लिए पारदर्शी पैनल उपयोगी था ताकि उपयोगकर्ता फोकस को एप्लिकेशन के उपयुक्त क्षेत्र में स्थानांतरित कर दिया गया हो।


जहां तक ​​मुझे पता है कि पैनल में केवल पारदर्शी रंग हो सकता है, आप पैनल की अस्पष्टता को नियंत्रित नहीं कर सकते हैं। तो, आप पैनल के कुछ हिस्सों को पूरी तरह पारदर्शी कर सकते हैं लेकिन कुछ कहने के लिए 50% नहीं।

पारदर्शिता का उपयोग करने के लिए आपको पारदर्शी रंग संपत्ति को परिभाषित करना होगा।


कुछ टिप्पणियां कहती हैं कि यह काम करती है और कुछ कहते हैं कि यह केवल आपके form पृष्ठभूमि के लिए काम नहीं करता है, इसके पीछे कोई अन्य controls नहीं है


इसे इस्तेमाल करे:

panel1.BackColor = Color.FromArgb(100, 88, 44, 55);

वांछित अस्पष्टता प्राप्त करने के लिए अल्फा (ए) बदलें।


गतिशील रूप से इसे फ़ॉर्म कन्स्ट्रक्टर में बनाते समय अपने पैनल को सामने लाएं मत भूलना। टैब नियंत्रण के पारदर्शी पैनल ओवरले का उदाहरण।

panel1 = new TransparentPanel();
panel1.BackColor = System.Drawing.Color.Transparent;
panel1.Location = new System.Drawing.Point(0, 0);
panel1.Name = "panel1";
panel1.Size = new System.Drawing.Size(717, 92);
panel1.TabIndex = 0;
tab2.Controls.Add(panel1);
panel1.BringToFront(); 

// <== अन्यथा पारदर्शी पैनल के शीर्ष पर अन्य नियंत्रण पेंट


यह मेरे लिए काम करता है। नीचे उदाहरण में, अल्फा रेंज 0 से 255 के बीच एक मान हो सकती है। पहले, मैंने यह सोचकर गलती की कि यह प्रतिशत का मूल्य होना चाहिए।

Dim x as integer = 230 Panel1.BackColor = Color.FromArgb(x, Color.Blue)


मैं सिर्फ विलियम स्मैश समाधान में जोड़ना चाहता था क्योंकि मैं अपने ब्लॉग पर नहीं जा सका, इसलिए मेरे सरल प्रश्नों में जो जवाब हो सकते थे, वह नहीं मिल सका।

मुझे महसूस करने के लिए थोड़ी देर लग गई, लेकिन शायद मैं बस एक पल था ...

यदि आपको पहले से ऐसा करने की ज़रूरत नहीं है तो आपको प्रोजेक्ट गुणों में System.Windows.Forms का संदर्भ जोड़ना होगा।

इसके अलावा आपको जोड़ना होगा

Imports System.Windows.Forms 

उस फ़ाइल में जहां आप ओवरराइड क्लास जोड़ रहे हैं।

ऑनपेंटबैकग्राउंड के लिए आपको सिस्टम के लिए एक संदर्भ जोड़ना होगा। फिर ड्रॉइंग

Imports System.Drawing.Printing.PrintEventArgs

क्षमा करें, कोई टिप्पणी नहीं जोड़ सकते लेकिन यह सब गलत है।

अवलोकन योग्य चयन धागा सुरक्षित नहीं है। न केवल इस प्रेषक के मुद्दों के कारण, लेकिन यह बिल्कुल थ्रेड सुरक्षित नहीं है (एमएसडीएन से):

इस प्रकार के किसी भी सार्वजनिक स्थैतिक (विजुअल बेसिक में साझा) सदस्य थ्रेड सुरक्षित हैं। किसी भी इंस्टेंस सदस्यों को थ्रेड सुरक्षित होने की गारंटी नहीं है।

यहां देखें http://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx

BeginInvoke को "रीसेट" क्रिया के साथ कॉल करते समय भी एक समस्या है। "रीसेट" एकमात्र ऐसी क्रिया है जहां हैंडलर को स्वयं संग्रह को देखना चाहिए। यदि आप एक "रीसेट" शुरू करते हैं और फिर तुरंत शुरू करें हैंडलर से कुछ "जोड़ें" क्रियाएं पहले से अपडेट किए गए संग्रह के साथ "रीसेट" स्वीकार करेंगे और अगले "जोड़ें" की इच्छा एक गड़बड़ी करेगी।

यहां मेरा कार्यान्वयन है जो काम करता है। असल में मैं BeginInvoke को हटाने की सोच रहा हूं:

तेजी से प्रदर्शन और धागा सुरक्षित अवलोकन संग्रह





.net winforms transparency panel opacity