2015-09-04 6 views
5

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

मुझे पता है कि विजुअल स्टूडियो में Panels अस्पष्टता नहीं है, लेकिन मैं सोच रहा था कि अगर कोई इस बारे में एक तरीका-चाल-विचार जानता है कि इसे कैसे प्राप्त किया जा सकता है। मैंने Picture Box की कोशिश की लेकिन उसमें अस्पष्टता भी संपत्ति के रूप में नहीं थी। मैंने नियमित Menu ऑब्जेक्ट का उपयोग करने से परहेज किया जो विज़ुअल स्टूडियो ऑफ़र करता है क्योंकि मैं और डिज़ाइन जोड़ना चाहता था। कोई विचार?

+0

की [मैं अस्पष्टता या WinForms में एक पैनल की पारदर्शिता सेट कर सकते हैं कैसे?] (Http संभव डुप्लिकेट: //stackoverflow.com/questions/4463363/how-can-i-set-the-opacity-or-transparency-of-a-panel-in-winforms) –

+0

मैंने इसे देखा है, लेकिन यह मेरे लिए काम नहीं करता है, इसलिए मैंने पूछा। Thx –

+1

मुझे नहीं लगता कि यह एक डुप्लिकेट है। पोस्टर जानता है कि नियंत्रण के लिए कोई अस्पष्टता नहीं है। – taffer

उत्तर

2

नियंत्रण "पारदर्शी" बनाने के लिए, आपको अपने माता-पिता के सही क्षेत्र को नियंत्रण में पेंट करना चाहिए। Button यह सामग्री को खींचने से पहले करता है, इसलिए गोलाकार कोनों पारदर्शी होंगे।

अर्द्ध पारदर्शिता की नकल करने के लिए, आप पैनल पर प्रपत्र पेंट कर सकते हैं, और फिर अल्फा के साथ कुछ आकर्षित:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    PaintTransparentBackground(panel1, e); 
    using (Brush b = new SolidBrush(Color.FromArgb(128, panel1.BackColor))) 
    { 
     e.Graphics.FillRectangle(b, e.ClipRectangle); 
    } 
} 

private static void PaintTransparentBackground(Control c, PaintEventArgs e) 
{ 
    if (c.Parent == null || !Application.RenderWithVisualStyles) 
     return; 

    ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c); 
} 

Semi-transparent panel

कृपया ध्यान दें कि ButtonRenderer.DrawParentBackgroundनियंत्रण रंग नहीं है फॉर्म के साथ, जो पैनल के साथ ओवरलैप करता है, लेकिन केवल फॉर्म की पृष्ठभूमि।

+0

यदि ओवरलैप होने के लिए नियंत्रण हैं तो भी आप drawtobitmap के साथ बिटमैप में लक्ष्य प्राप्त कर सकते हैं। एनीमेशन Winforms में shite की तरह दिखेगा, हालांकि .. – TaW

10
  1. Panel से विरासत में मिली कक्षा बनाएं।
  2. कन्स्ट्रक्टर में नियंत्रण के लिए शैली ControlStyle.Opaque सेट करें।

अगर सही है तो नियंत्रण अपारदर्शी तैयार की है और पृष्ठभूमि चित्रित नहीं है।

  1. अवहेलना CreateParams और इसके लिए WS_EX_TRANSPARENT शैली निर्धारित किया है।

निर्दिष्ट करता है कि इस शैली के साथ बनाया एक खिड़की पारदर्शी होना है। यही है, खिड़की के नीचे की कोई भी विंडो विंडो से अस्पष्ट नहीं है। इस शैली के साथ बनाई गई विंडो को WM_PAINT संदेशों को प्राप्त करने के बाद ही सभी सिब्लिंग विंडो अपडेट किए गए हैं।

  1. एक Opacity संपत्ति है कि 0 से 100 कि पृष्ठभूमि के अल्फा चैनल के रूप में उपयोग किया जाएगा करने के लिए मान स्वीकार करता है बनाएँ।
  2. OnPaint ओवरराइड करें और अल्फा सक्षम Brush का उपयोग कर पृष्ठभूमि भरें जो BackGroundColor और Opacity से बनाई गई है।

पूरा कोड

public class ExtendedPanel : Panel 
{ 
    private const int WS_EX_TRANSPARENT = 0x20; 
    public ExtendedPanel() 
    { 
     SetStyle(ControlStyles.Opaque, true); 
    } 

    private int opacity = 50; 
    [DefaultValue(50)] 
    public int Opacity 
    { 
     get 
     { 
      return this.opacity; 
     } 
     set 
     { 
      if (value < 0 || value > 100) 
       throw new ArgumentException("value must be between 0 and 100"); 
      this.opacity = value; 
     } 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT; 
      return cp; 
     } 
    } 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255/100, this.BackColor))) 
     { 
      e.Graphics.FillRectangle(brush, this.ClientRectangle); 
     } 
     base.OnPaint(e); 
    } 
} 

स्क्रीनशॉट

enter image description here

+0

अच्छा समाधान। मैंने इसे टाइमर के साथ कार्यान्वित किया ताकि अस्पष्टता 100 से शुरू हो और 0 पर नीचे जा सके। हालांकि यह पागल की तरह झटकेदार है। कोई आसान विचार कैसे एक चिकनी एनीमेशन प्राप्त करने के लिए? – ChrisB

+1

@ChrisB मैं इसे टाइमर का उपयोग करके देखता हूं, लेकिन शायद आपको [यह पोस्ट] (http://stackoverflow.com/a/34338985/3110834) उपयोगी लगेगा। –

+0

@ChrisB वैसे, मैंने इस मामले के लिए [इस समाधान] (http://stackoverflow.com/a/39068779/3110834) का उपयोग किया जिसके लिए मुझे विंडोज़ फॉर्मों में अर्ध-पारदर्शी ओवरले की आवश्यकता थी। (यह अप्रासंगिक लगता है, लेकिन कुछ मामलों में एक ओवरले के रूप में एक फॉर्म का उपयोग करना अधिक विश्वसनीय समाधान है।) –

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

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