Estoy tratando de crear un botón transparente en C# (.NET 3.5 SP1) para usar en mi aplicación WinForms. He intentado todo para que el botón sea transparente (debe mostrar el fondo degradado debajo del botón) pero simplemente no funciona.Dibujando un botón transparente
Aquí está el código que estoy usando:
public class ImageButton : ButtonBase, IButtonControl
{
public ImageButton()
{
this.SetStyle(
ControlStyles.SupportsTransparentBackColor |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs pevent)
{
Graphics g = pevent.Graphics;
g.FillRectangle(Brushes.Transparent, this.ClientRectangle);
g.DrawRectangle(Pens.Black, this.ClientRectangle);
}
// rest of class here...
}
El problema es que el botón parece estar agarrando la memoria de interfaz de usuario al azar de alguna parte y el llenado en sí con un poco de memoria intermedia de la interfaz de usuario de Visual Studio (en modo de diseño) En tiempo de ejecución, está tomando un búfer de cero y es completamente negro.
Mi objetivo final es pintar una imagen en un botón invisible en lugar del rectángulo. El concepto debería seguir siendo el mismo sin embargo. Cuando el usuario pasa el cursor sobre el botón, se dibuja una forma de botón.
¿Alguna idea?
EDIT: Gracias a todos, los siguientes trabajó para mí:
public class ImageButton : Control, IButtonControl
{
public ImageButton()
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.ResizeRedraw, true);
this.BackColor = Color.Transparent;
}
protected override void OnPaint(PaintEventArgs pevent)
{
Graphics g = pevent.Graphics;
g.DrawRectangle(Pens.Black, this.ClientRectangle);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
// don't call the base class
//base.OnPaintBackground(pevent);
}
protected override CreateParams CreateParams
{
get
{
const int WS_EX_TRANSPARENT = 0x20;
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
// rest of class here...
}
parece ser un duplicado de: http://stackoverflow.com/questions/201778/can-i-create-transparent-buttons-in-visual -studio-2005-with-c – Aamir
Lo que se sugirió en ese hilo no funcionó para mí. – rein
intente pintar con un nuevo color con 0 valor de opacidad en lugar de Color.Transparent – TheVillageIdiot