c# - una - label transparente vba excel
¿Por qué una etiqueta de WinForms no quiere ser transparente? (11)
¿Por qué no puedo establecer BackColor of a Label en Transparent? Lo he hecho antes, pero ahora simplemente no quiero ...
Creé un nuevo UserControl, le agregué una barra de progreso y una etiqueta. Cuando configuro BackColor de la etiqueta como transparente, sigue siendo gris = / ¿Por qué es esto?
Lo que quería era tener la etiqueta en la parte superior de la barra de progreso para que su texto estuviera "en" la barra de progreso ...
Agregue una nueva clase a su proyecto y publique el código que se muestra a continuación. Construir. Coloque el nuevo control desde la parte superior de la caja de herramientas en su formulario.
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;
}
}
}
Aquí hay un control transparente que escribí hace un rato que muestra texto girado. La mayoría del código proviene de here , aunque el IIRC tuve que hacer algunos ajustes para que funcione.
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);
}
}
}
Entonces, como decía el comentario de mi respuesta anterior, Control es el comportamiento predeterminado, y es lo que recordé como transparente.
De todos modos, ¿ha intentado establecer la propiedad de fondo de su UserControl, o el contenedor en el que se encuentra su etiqueta (Panel, Formulario, lo que sea?), Su etiqueta debe reflejar ese color :)
Respuesta anterior: Ha pasado un tiempo desde que hice la programación de winforms, pero como recuerdo, las etiquetas son transparentes por defecto. por lo tanto, es solo el texto que obtiene un color real y el color de fondo imita lo que está detrás de él :)
Es posible hacer exactamente lo que quiere lograr. Simplemente toma un poco de tiempo jugar con los controles. Es posible crear un control de etiqueta con fondo transparente y colocarlo encima del control de la barra de progreso.
Verifique mi respuesta a otra pregunta SO.
Esta es una solución muy simple y funciona genial:
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);
}
}
Cuando el color de fondo de la etiqueta es transparente, la etiqueta solo toma una imagen de su control subyacente la primera vez que se crea, después de que el color de fondo de la etiqueta es constante. Y cada vez que la etiqueta se vuelve a pintar, se vuelve a pintar con ese color o patrón fijo.
Anular CreateParams afecta la forma en que se creará la ventana para el control, esto permite una transparencia real.
Anulando WndProc usted controla qué mensajes se deben pasar a la clase base. Debemos filtrar WM_ERASEBKGND y WM_PAINT, pero también tenemos que activar el evento paint.
La solución más simple es la siguiente:
Establezca el color de fondo para la transparencia en el editor visual o en el constructor de su formulario:
this.label1.BackColor = System.Drawing.Color.Transparent;
Establezca la propiedad Parent de su etiqueta para controlar que desea ser visible detrás del texto. Esto se puede hacer en el constructor de formulario o en el método de carga:
this.label1.Parent = progressBar1;
Es cierto que esto no es una verdadera transparencia como en DirectX. El resultado que ve en la pantalla está compuesto solo de dos capas. No puede resumir más de dos capas con este enfoque (cada capa tiene su propia transparencia definida por el parámetro alfa). Pero es adecuado para muchas situaciones prácticas que puede encontrar en la programación de Winforms.
Seleccione BackColor , vaya a la pestaña Web y seleccione Transparente. Genera lo siguiente.
this.label1.BackColor = System.Drawing.Color.Transparent;
Si desea enfocarse en el diseño de su aplicación de Windows, le sugiero que use WPF.
Hacer los controles transparentes en WPF es muy fácil.
<TextBox Width="200" Height="40" Opacity="0.5"/>
Use un LinkLabel no es una etiqueta normal
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;
}
WinForms realmente no admite controles transparentes, pero usted mismo puede hacer un control transparente. Vea mi respuesta aquí .
En su caso, probablemente deba subclasificar la barra de progreso y anular el método OnPaint para dibujar un texto en la barra de progreso.
en cuanto a una explicación para su problema, Windows no hace transparencia para los controles de fondo como es de esperar, supongo que el fondo gris es en realidad la superficie del formulario. se ignoran los controles que se dibujan entre la superficie del formulario y su etiqueta.