2009-03-03 5 views
27

मैं लेबल के बैककोलर को पारदर्शी क्यों नहीं सेट कर सकता? मैंने इसे पहले किया है, लेकिन अब यह नहीं चाहता ...क्यों WinForms लेबल पारदर्शी नहीं होना चाहते हैं?

मैंने एक नया UserControl बनाया, इसमें एक प्रगतिबार और एक लेबल जोड़ा। जब मैं लेबल के बैककोलर को पारदर्शी पर सेट करता हूं तो यह अभी भी ग्रे =/यह क्यों है?

मैं क्या चाहता था, इसलिए है कि इसके पाठ था "में" प्रगति बार ...

+0

एलेक्सेंडर विल्मसे का जवाब देखें। – blez

+0

आपकी अंतिम वाक्य (प्रगति पट्टी में एक टेक्स्ट डालने) के बारे में: [माइक्रोसॉफ्ट से प्रोग्रेस बार दिशानिर्देश] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx) कहें: _Don ' प्रगति पट्टी पर प्रतिशत पूर्ण या कोई अन्य पाठ डालें। इस तरह का पाठ सुलभ नहीं है और विषयों का उपयोग करने के साथ संगत नहीं है। _ तो यदि आप एक और तरीका ढूंढ सकते हैं, तो यह अधिक संगत होगा और यह बेहतर और अधिक सुसंगत दिखाई देगा। कृपया ऊपर दिये गये दिशानिर्देश देखें। – miroxlav

उत्तर

14

WinForms वास्तव में पारदर्शी नियंत्रण का समर्थन नहीं करता है, लेकिन आप स्वयं पारदर्शी नियंत्रण कर सकते हैं। See my answer here

आपके मामले में आपको प्रगति पट्टी को उप-वर्ग करना चाहिए और प्रगति पट्टी पर एक टेक्स्ट खींचने के लिए ऑनपेंट विधि को ओवरराइड करना चाहिए।

+0

आप प्रगति पट्टी पर पाठ कैसे आकर्षित करेंगे? – Svish

+0

मैंने इसे प्रगति पट्टी के लिए नहीं किया है, लेकिन आप ऑनपेंट विधि के लिए अधिभार बना सकते हैं। यहां आप पहले बेस को कॉल करते हैं। ऑनपेंट और फिर नियंत्रण के शीर्ष पर टेक्स्ट खींचने के लिए ईवेंट तर्कों में पारित ग्राफिक्स ऑब्जेक्ट का उपयोग करें। –

+4

यह सुनिश्चित नहीं है कि एक उत्तर एसओ उत्तर को संदर्भित करता है, जो कि विधि के महत्वपूर्ण विवरण देने के बजाय 'Google पर इसे देखें' कहता है, जब इस पृष्ठ पर किसी अन्य उत्तर में पूर्ण समाधान दिया जाता है तो स्वीकार किया जाता था। – jwg

0

तो जैसा कि मेरे पिछले जवाब देने के लिए टिप्पणी में कहा गया है, नियंत्रण डिफ़ॉल्ट व्यवहार है प्रगतिबार के शीर्ष पर लेबल के लिए गया था और जो मुझे पारदर्शी होने के रूप में याद किया जाता है।

वैसे भी, आप अपने UserControl की पृष्ठभूमि संपत्ति की स्थापना की कोशिश की है, या कंटेनर अपने लेबल (पैनल, फार्म, जो कुछ भी?) में है, अपने लेबल कि रंग :)


ओल्ड उत्तर को प्रतिबिंबित करना चाहिए : यह थोड़ी देर के बाद से मैंने प्रोग्रामिंग Winforms किया है, लेकिन जैसा कि मुझे याद है लेबल प्रति डिफ़ॉल्ट पारदर्शी हैं? इस प्रकार यह केवल एक पाठ है जो वास्तविक रंग प्राप्त करता है और बैकग्राउंड रंग उसके पीछे जो भी है उसे नकल करता है :)

+0

नहीं, डिफ़ॉल्ट रूप से लेबल में पृष्ठभूमि का नियंत्रण होता है। हालांकि, आप उस सेटिंग में सही हैं जो पारदर्शी को नियंत्रित करने वाले नियंत्रण के रंग की नकल करता है, जिससे यह पृष्ठभूमि को ठोस भूरे रंग के रूप में चित्रित करता है। –

+0

WinForms को निकाल दिया जाना चाहिए और चेक किया गया: पी, सच्चा नियंत्रण डिफ़ॉल्ट व्यवहार है, यह सिर्फ पारदर्शी लगता है क्योंकि वे एक ही रंग साझा करते हैं :) – thmsn

1

यदि आप अपने विंडोज़ एप्लिकेशन को डिजाइन करने पर ध्यान केंद्रित करना चाहते हैं, तो मेरा सुझाव है कि आप WPF का उपयोग करें।

WPF में पारदर्शी controles बनाना बहुत आसान है।

<TextBox Width="200" Height="40" Opacity="0.5"/> 
+6

मुझे यकीन है कि डब्ल्यूपीएफ पारदर्शी लेबल सही तरीके से करता है, हालांकि सिर्फ यह इंगित करना चाहता था कि इस उदाहरण में कोड, यदि लेबल पर लागू होता है, तो पाठ को semitransparent भी बना देगा - जो वांछित नहीं है! –

29

अपनी परियोजना में एक नई कक्षा जोड़ें और नीचे दिखाए गए कोड को पोस्ट करें। बनाएँ। टूलबॉक्स के शीर्ष से अपने फॉर्म पर नया नियंत्रण ड्रॉप करें।

using System; 
using System.Windows.Forms; 

public class TransparentLabel : Label { 
    public TransparentLabel() { 
    this.SetStyle(ControlStyles.Opaque, true); 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false); 
    } 
    protected override CreateParams CreateParams { 
    get { 
     CreateParams parms = base.CreateParams; 
     parms.ExStyle |= 0x20; // Turn on WS_EX_TRANSPARENT 
     return parms; 
    } 
    } 
} 
+0

अच्छा, यह लगभग काम करता प्रतीत होता है। समस्या यह है कि जब यह एक प्रगति पट्टी पर है। ऐसा लगता है जैसे टेक्स्ट गायब हो जाता है और कभी-कभी फिर से दिखाई देता है ... – Svish

+0

जब मैं प्रोग्रेसबार मान को किसी चीज़ पर सेट करता हूं तो टेक्स्ट चला जाता है ... – Svish

+0

प्रभावों को ढेर करना समर्थित नहीं है, यह केवल कंटेनर में परिवर्तन ट्रैक कर सकता है। –

0

यह वही करना संभव है जो आप प्राप्त करना चाहते हैं। नियंत्रण के साथ खेलने में थोड़ा समय लगता है। पारदर्शी पृष्ठभूमि के साथ लेबल नियंत्रण बनाना संभव है, और इसे प्रोग्रेसबार नियंत्रण के शीर्ष पर रखें।

my answer to अन्य SO प्रश्न पूछें।

0

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

-3

बैककोलर का चयन करें, वेब टैब पर जाएं, और पारदर्शी का चयन करें। निम्नलिखित उत्पन्न करता है।

 this.label1.BackColor = System.Drawing.Color.Transparent; 
+0

मैंने यही किया है, लेकिन यह प्रगति पट्टी के शीर्ष पर काम नहीं करता है :) – Svish

1

यहां एक पारदर्शी नियंत्रण है जिसे मैंने कुछ समय पहले लिखा था जो घुमावदार पाठ प्रदर्शित करता है। अधिकांश कोड here से आता है, हालांकि आईआईआरसी को इसे काम करने के लिए कुछ बदलाव करना पड़ा।

using System; 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Drawing.Text; 
using System.Linq; 
using System.Windows.Forms; 

namespace MyNamespace 
{ 
    public partial class RotatedText : UserControl 
    { 
     private readonly Timer _invalidationTimer; 
     private const int WS_EX_TRANSPARENT = 0x00000020; 

     public RotatedText() 
     { 
      this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
      InitializeComponent(); 

      _invalidationTimer = new Timer {Interval = 500, Enabled = true}; 
      _invalidationTimer.Tick += TickHandler; 
     } 

     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [Category("Appearance")] 
     [Description("Text which appears in control")] 
     public string Text { get; set; } 

     #region Transparent background 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= WS_EX_TRANSPARENT; 
       return cp; 
      } 
     } 

     private void TickHandler(object sender, EventArgs e) 
     { 
      InvalidateEx(); 
     } 

     private void InvalidateEx() 
     { 
      if (Parent != null) 
       Parent.Invalidate(Bounds, false); 
      else 
       Invalidate(); 
     } 

     protected override void OnPaintBackground(PaintEventArgs e) 
     { 
      //Intentionally do nothing - stops background from drawing 
      //base.OnPaintBackground(e); 
     } 
     #endregion 

     //Rotate text and draw 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      double angleRadians = Math.Atan2(Height, Width); 
      float angleDegrees = -1*(float) (angleRadians*180/Math.PI); 
      angleDegrees *= 0.9f; 
      e.Graphics.RotateTransform(angleDegrees, MatrixOrder.Append); 
      e.Graphics.TranslateTransform(20, Height - 75, MatrixOrder.Append); 
      e.Graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
      Font font = new Font("Ariel", 50); 
      e.Graphics.DrawString(Text, font, Brushes.Gray, 1, 2); //Shadow 
      e.Graphics.DrawString(Text, font, Brushes.Red, 0, 0); 
     } 
    } 
} 
4

एक LinkLabel नहीं एक सामान्य लेबल

private void MakeTransparentLabel(System.Windows.Forms.LinkLabel LinkLabel) 
    { 
     this.MakeTransparentLabel(LinkLabel, Color.White); 
    } 
    private void MakeTransparentLabel(System.Windows.Forms.LinkLabel LinkLabel, Color ForeColor) 
    { 
     LinkLabel.ForeColor = ForeColor; 
     LinkLabel.LinkColor = ForeColor; 
     LinkLabel.VisitedLinkColor = ForeColor; 
     LinkLabel.ActiveLinkColor = ForeColor; 
     LinkLabel.DisabledLinkColor = ForeColor; 
     LinkLabel.LinkArea = new LinkArea(0, 0); 
     LinkLabel.LinkBehavior = LinkBehavior.NeverUnderline; 
     LinkLabel.Cursor = Cursors.Arrow; 
     LinkLabel.BackColor = Color.Transparent; 
    } 
    private void SetTransparentLabelText(System.Windows.Forms.LinkLabel LinkLabel, string Text) 
    { 
     if (string.IsNullOrEmpty(Text)) { LinkLabel.Text = " "; return; } 
     LinkLabel.Text = Text; 
    } 
+0

धन्यवाद आदमी। इससे मुझे बहुत काम बचाया। – blez

6

सबसे सरल उपाय का प्रयोग करें पीछा कर रहा है:

  1. सेट पृष्ठभूमि रंग या तो दृश्य संपादक में या अपने फार्म के निर्माता में पारदर्शिता के लिए:

    this.label1.BackColor = System.Drawing.Color.Transparent;

  2. अपने लेबल की मूल संपत्ति सेट करें ताकि आप यह नियंत्रित कर सकें कि आप पाठ के पीछे दिखाई देना चाहते हैं। यह फॉर्म कन्स्ट्रक्टर में या लोड विधि में किया जा सकता है:

    this.label1.Parent = progressBar1;

यह सच है कि यह डायरेक्टएक्स में वास्तविक पारदर्शिता नहीं है। परिणाम जो आप डिस्प्ले पर देखते हैं केवल दो परतों से बना है। आप इस दृष्टिकोण के साथ दो से अधिक परतों को जोड़ नहीं सकते हैं (प्रत्येक परत में अल्फा पैरामीटर द्वारा परिभाषित अपनी पारदर्शिता है)। लेकिन यह Winforms प्रोग्रामिंग में कई व्यावहारिक स्थितियों के लिए उपयुक्त है।

+0

अच्छी चाल - मुझे लेबल पर लेबल की आवश्यकता है। –

1

यह एक बहुत ही सरल उपाय है और अच्छा काम करता है:

public class MyLabel : Label 
{ 
    private bool fTransparent = false; 
    public bool Transparent 
    { 
     get { return fTransparent; } 
     set { fTransparent = value; } 
    } 
    public MyLabel() : base() 
    { 
    } 
    protected override CreateParams CreateParams 
    { 
     get 
     { 
      if (fTransparent) 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 
       return cp; 
      } 
      else return base.CreateParams; 
     } 
    } 
    protected override void WndProc(ref Message m) 
    { 
     if (fTransparent) 
     { 
      if (m.Msg != 0x14 /*WM_ERASEBKGND*/ && m.Msg != 0x0F /*WM_PAINT*/) 
       base.WndProc(ref m); 
      else 
      { 
       if (m.Msg == 0x0F) // WM_PAINT 
        base.OnPaint(new PaintEventArgs(Graphics.FromHwnd(Handle), ClientRectangle)); 
       DefWndProc(ref m); 
      } 
     } 
     else base.WndProc(ref m); 
    } 
} 

जब लेबल backcolor पारदर्शी है, तो लेबल केवल उसके अंतर्निहित नियंत्रण की तस्वीर पहली बार जब यह बनाई गई है लेता है, उसके बाद लेबल backcolor स्थिर है । और हर बार जब लेबल खुद को पश्चाताप करता है, तो वह उस निश्चित रंग या पैटर्न को दर्शाता है।

ओवरराइडिंग CreateParams इस पर प्रभाव डालता है कि नियंत्रण के लिए विंडो कैसे बनाई जाएगी, इससे वास्तविक पारदर्शिता सक्षम हो जाती है।

ओवरराइडिंग WndProc आप नियंत्रित करते हैं कि कौन से संदेश बेस क्लास में पास किए जाने चाहिए। हमें WM_ERASEBKGND और WM_PAINT को फ़िल्टर करना होगा, लेकिन हमें पेंट ईवेंट ट्रिगर करना होगा।

+0

क्या यह एक चलती प्रगति पट्टी के शीर्ष पर काम करेगा? – Svish

+0

यह काम करना चाहिए, क्योंकि मूल अंडरलेइंग नियंत्रण को खुद को पेंट न करने का तरीका यह है कि इस तरह से खुद को पेंट न करें। –

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