visual tutorial studio proyectos instalar form espaƱol ejemplos c# winforms

tutorial - windows forms c# visual studio 2017



Haciendo un control transparente (4)

¡¡genial!! Finalmente logré dibujar formas transparentes. He añadido un método virtual.

Draw(g);

justo antes de

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

Y al final la declaración del método virtual.

protected virtual void Draw(Graphics g){ }

Ahora puedo seguir creando mis propias formas transparentes, gráficos, etc.

Actualmente estoy desarrollando una herramienta de edición de imágenes simple utilizando Winforms y .NET 3.5 (entorno de trabajo).

Tengo el requisito de que cuando el usuario haga clic en un botón de selección de herramienta, aparecerá un cuadrado (rectángulo en C #) que puede escalar entre 100x100 y 400x400 . He solucionado este problema: el problema se presenta al hacer transparente el fondo del rectángulo.

No estoy muy claro si la transparencia es compatible con .NET 3.5 , he intentado lo siguiente:

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

Pero esto no tiene efecto, cualquier consejo sería apreciado.


Aquí está lo que me funcionó porque las otras soluciones no funcionaron.

Esto es con UserControl transparente agregado a ListView / TreeView Control Collection

Sé que dice ButtonRenderer pero debería funcionar para cualquier control.

En el UserControl:

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

en el control de los padres:

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); }


Deberá usar la propiedad Opacity y establecerla en cero para que la forma sea invisible.

Si desea hacer que un control sea Transparente, como lo ha intentado en su ejemplo, consulte este artículo

Cómo: Darle a tu control un fondo transparente

Dice que el código que has escrito, debe estar en el constructor del control. Por lo tanto, supongo que tendrá que crear un control personalizado derivado del tipo de pnlSelectArea, muy probablemente un botón. En el constructor de ese control personalizado puede escribir código para configurar su estilo y color.


Este es mi Control especial que contiene una propiedad de opacidad, funciona al 100%:

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); } }