c# - studio - cambiar color de boton al hacer clic html
Botón personalizado en C#: ¿Cómo eliminar el fondo de desplazamiento? (8)
Estoy intentando hacer un botón personalizado para mi formulario (que tiene FormBorderStyle = none) usando Visual Studio 2005. Tengo mis 3 imágenes de botón de estados en una ImageList vinculada al botón.
this.btnClose.AutoSize = false;
this.btnClose.BackColor = System.Drawing.Color.Transparent;
this.btnClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.btnClose.FlatAppearance.BorderSize = 0;
this.btnClose.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnClose.ForeColor = System.Drawing.Color.Transparent;
this.btnClose.ImageKey = "Disabled";
this.btnClose.ImageList = this.imageList1;
this.btnClose.Location = new System.Drawing.Point(368, -5);
this.btnClose.Margin = new System.Windows.Forms.Padding(0);
this.btnClose.Name = "btnClose";
this.btnClose.Size = new System.Drawing.Size(31, 31);
this.btnClose.TabIndex = 0;
this.btnClose.UseVisualStyleBackColor = false;
this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave);
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
this.btnClose.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnClose_MouseDown);
this.btnClose.MouseHover += new System.EventHandler(this.btnClose_MouseHover);
private void btnClose_MouseHover(object sender, EventArgs e)
{
btnClose.ImageKey = "enabled";
}
private void btnClose_MouseDown(object sender, MouseEventArgs e)
{
btnClose.ImageKey = "down";
}
private void btnClose_MouseLeave(object sender, EventArgs e)
{
btnClose.ImageKey = "disabled";
}
Todo está funcionando, pero hay una trampa. Cada vez que muevo el mouse sobre el botón obtengo un fondo gris realmente molesto.
¿Cómo puedo eliminar eso?
El fondo gris se debe a la configuración de "System.Windows.Forms.FlatStyle.Flat", es el comportamiento predeterminado, ya que tiene que resaltar el botón cuando se desplaza. Para eliminar eso, es posible que deba escribir una clase de botón personalizada, heredar del botón original y hacer una pintura personalizada para lograrlo.
Por cierto, en lugar de configurar "enabled" en MouseHover, deberías hacerlo en MouseEnter. MouseEnter y MouseLeave es un par que indica si el mouse está dentro del botón o no, y se dispara una vez por entrada / salida. Donde, como MouseHover, se dispara cada vez que el mouse se movía dentro del botón, lo cual crea una configuración repetida de "habilitada".
Lo he solucionado usando una etiqueta en lugar de un botón.
//
// imageListButtons
//
this.imageListButtons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListButtons.ImageStream")));
this.imageListButtons.TransparentColor = System.Drawing.Color.Transparent;
this.imageListButtons.Images.SetKeyName(0, "close_normal");
this.imageListButtons.Images.SetKeyName(1, "close_hover");
//
// lblClose
//
this.lblClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.lblClose.BackColor = System.Drawing.Color.Transparent;
this.lblClose.ImageKey = "close_normal";
this.lblClose.ImageList = this.imageListButtons;
this.lblClose.Location = new System.Drawing.Point(381, 7);
this.lblClose.Margin = new System.Windows.Forms.Padding(0);
this.lblClose.Name = "lblClose";
this.lblClose.Size = new System.Drawing.Size(12, 12);
this.lblClose.TabIndex = 0;
this.lblClose.MouseLeave += new System.EventHandler(this.lblClose_MouseLeave);
this.lblClose.MouseClick += new System.Windows.Forms.MouseEventHandler(this.lblClose_MouseClick);
this.lblClose.MouseEnter += new System.EventHandler(this.lblClose_MouseEnter);
private void lblClose_MouseEnter(object sender, EventArgs e)
{
lblClose.ImageKey = "close_hover";
}
private void lblClose_MouseLeave(object sender, EventArgs e)
{
lblClose.ImageKey = "close_normal";
}
private void lblClose_MouseClick(object sender, MouseEventArgs e)
{
this.Close();
}
PD: note que estoy usando ahora un botón de dos estados, en lugar de tres. Está destinado (sé que aún puedo usar tres).
crear el evento Mouse Enter que se muestra a continuación.
private void forAllButtons_MouseEnter(object sender, EventArgs e)
{
Button b = (Button)sender;
b.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
}
luego asigne este evento a todos los botones.
Feliz programación :)
btnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent;
También puede dejar de cambiar el color del botón deseleccionando la opción IsHitTestVisible en Button Properties> common> IsHitTestVisible. Quizás esto también ayude ...
Tengo una sugerencia. Cree su propia clase de botón derivando el botón de forma. Luego anule el evento MouseEnter en eso. Simplemente elimine el código para llamar a la implementación base.
base.OnMouseEnter(e)
PD: No podrá usar el evento MouseEnter fuera de la clase derivada (por ejemplo, un proyecto que use este control)
Hola, simplemente puedes aplicar estos cambios a tu botón fácilmente usando estas dos líneas de códigos.
Establezca FlatStyle del botón en Flat
this.btnClose.FlatStyle = FlatStyle.Flat;
Establezca MouseOverBackColor del botón en Transparente
this.btnClose.FlatAppearance.MouseOverBackColor = Color.Transparent;
Espero que esto ayude Gracias
Para resolver el problema, configure MouseOverBackColor en transparente para quitar el fondo de color gris.