2012-02-20 18 views
14

Attualmente sto sviluppando un semplice strumento di modifica delle immagini utilizzando Winform e .NET 3.5 (ambiente di lavoro).Creazione di un controllo trasparente

Ho un requisito che quando l'utente fa clic su un pulsante di selezione dello strumento, viene visualizzato un quadrato (rettangolo in C#) che è possibile scalare tra 100x100 e 400x400. Ho risolto questo problema: il problema è la trasparenza dello sfondo del rettangolo.

Sono un po 'poco chiaro su se la trasparenza è supportato in .NET 3.5, ho provato la seguente:

SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
pnlSelectArea.BackColor = Color.Transparent; 
pnlSelectArea.ForeColor = Color.Transparent; 
selectArea1.BackColor = Color.Transparent; 
selectArea1.ForeColor = Color.Transparent; 

Ma questo non ha alcun effetto - tutto il consiglio sarebbe apprezzato.

+0

Selezionare questa http://stackoverflow.com/questions/72994/net-windows-forms-transparent-control – papaiatis

+0

Grazie per l'aiuto - Non posso applicare nulla di tutto ciò alla mia soluzione, ma apprezzo lo sforzo. –

+0

Puoi trovare il mio approccio semplice spiegato nel post [qui:] (http://stackoverflow.com/a/34404064/1529012) – aleksandaril

risposta

42

Questo è il mio speciale di controllo che contiene una proprietà di opacità, è al 100% funziona:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 

public class TranspCtrl : Control 
{ 
    public bool drag = false; 
    public bool enab = false; 
    private int m_opacity = 100; 

    private int alpha; 
    public TranspCtrl() 
    { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     SetStyle(ControlStyles.Opaque, true); 
     this.BackColor = Color.Transparent; 
    } 

    public int Opacity 
    { 
     get 
     { 
      if (m_opacity > 100) 
      { 
       m_opacity = 100; 
      } 
      else if (m_opacity < 1) 
      { 
       m_opacity = 1; 
      } 
      return this.m_opacity; 
     } 
     set 
     { 
      this.m_opacity = value; 
      if (this.Parent != null) 
      { 
       Parent.Invalidate(this.Bounds, true); 
      } 
     } 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle = cp.ExStyle | 0x20; 
      return cp; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); 

     Color frmColor = this.Parent.BackColor; 
     Brush bckColor = default(Brush); 

     alpha = (m_opacity * 255)/100; 

     if (drag) 
     { 
      Color dragBckColor = default(Color); 

      if (BackColor != Color.Transparent) 
      { 
       int Rb = BackColor.R * alpha/255 + frmColor.R * (255 - alpha)/255; 
       int Gb = BackColor.G * alpha/255 + frmColor.G * (255 - alpha)/255; 
       int Bb = BackColor.B * alpha/255 + frmColor.B * (255 - alpha)/255; 
       dragBckColor = Color.FromArgb(Rb, Gb, Bb); 
      } 
      else 
      { 
       dragBckColor = frmColor; 
      } 

      alpha = 255; 
      bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); 
     } 
     else 
     { 
      bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); 
     } 

     if (this.BackColor != Color.Transparent | drag) 
     { 
      g.FillRectangle(bckColor, bounds); 
     } 

     bckColor.Dispose(); 
     g.Dispose(); 
     base.OnPaint(e); 
    } 

    protected override void OnBackColorChanged(EventArgs e) 
    { 
     if (this.Parent != null) 
     { 
      Parent.Invalidate(this.Bounds, true); 
     } 
     base.OnBackColorChanged(e); 
    } 

    protected override void OnParentBackColorChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnParentBackColorChanged(e); 
    } 
} 
+0

ha funzionato bene per me. – Rob

+0

ppl copia e incolla nella tua classe personalizzata e cambia il nome del costruttore. funziona perfettamente !! grazie – hasan83

+1

Questo ha attualmente un bug grave. Nell'override di OnPaint, chiama Dispose sull'oggetto e.Graphics, che non dovrebbe essere eseguito. È probabile che l'applicazione si arresti in modo anomalo se si smaltisce l'oggetto Graphics che è stato passato. Se non lo si è creato, non è necessario smaltirlo. – Tim

4

È necessario utilizzare la proprietà Opacity e impostarlo su zero per rendere la forma invisibile.

Se si vuole fare un controllo trasparente, come si è tentato nel tuo esempio, si veda questo articolo

How to: Give Your Control a Transparent Background

E dire il codice che hai scritto, deve essere nel costruttore del controllo. Quindi, immagino, sarà necessario creare un controllo personalizzato derivato dal tipo più probabile del pulsante pnlSelectArea. Nel costruttore di questo controllo personalizzato puoi scrivere il codice per impostare il suo stile e colore.

+0

Non voglio rendere invisibile il controllo. Voglio rendere il suo contenuto invisibile in modo da poterlo usare per scorrere su diverse parti dell'immagine e usarlo come "strumento di selezione" –

+0

Quindi impostare Opacità di quel contenuto. – Maheep

+1

Proprietà Brother Mahepp no ​​Opacity in winforms solo nel WPF –

0

grande !! Sono finalmente riuscito a disegnare forme trasparenti. Ho aggiunto un metodo virtuale

Draw(g); 

destra prima

bckColor.Dispose(); 
g.Dispose(); 
base.OnPaint(e); 

e alla fine la dichiarazione del metodo virtuale

protected virtual void Draw(Graphics g){ } 

Ora posso continuare a creare le mie forme trasparenti , grafica ecc ...

1

Ecco cosa ha funzionato con me perché le altre soluzioni non hanno funzionato.

Questo è con UserControl trasparente aggiunto al ListView/Controllo TreeView Collezione

so che dice ButtonRenderer ma dovrebbe funzionare per eventuali controlli.

Nella UserControl:

protected override void OnPaint(PaintEventArgs e) 
{ 
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); 
} 

nel controllo principale:

protected override void WndProc(ref Message m) 
{ 
    if(m.Msg == 0xF) 
     foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } 

    base.WndProc(ref m); 
} 
Problemi correlati