Botón personalizado en C #: ¿Cómo eliminar el fondo de desplazamiento?

Estoy tratando de hacer un botón personalizado para mi formulario (que tiene FormBorderStyle = none) usando Visual Studio 2005. Tengo las imágenes de mis 3 estados en un ImageList vinculado 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. Cuando muevo el mouse, muevo 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 debe resaltar el botón cuando se desplaza. Para eliminar eso, es posible que tenga que escribir una clase de botón personalizado, heredar del botón original y hacer un dibujo personalizado para lograrlo.

Por cierto, en lugar de configurar “habilitado” en MouseHover, debes 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 mueve dentro del botón, lo que crea un ajuste repetido de “habilitado”.

 btnClose.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; 

He resuelto esto 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 ahora estoy usando un botón de dos estados, en lugar de tres. Se pretende (sé que todavía puedo usar tres).

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

A continuación, asigne este evento a todos los botones.

Feliz progtwigcion 🙂

Tengo una sugerencia. Cree su propia clase de botón derivando la forma de Button. 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 usa este control)

Hola, simplemente puede aplicar estos cambios a su botón fácilmente usando estas dos líneas de códigos.

  1. Ajuste el FlatStyle del botón a Flat

     this.btnClose.FlatStyle = FlatStyle.Flat; 
  2. Establece el botón MouseOverBackColor en Transparente

     this.btnClose.FlatAppearance.MouseOverBackColor = Color.Transparent; 

Espero que esto ayude. Gracias

También puede dejar de cambiar el color del botón deseleccionando la opción IsHitTestVisible en Propiedades del botón> common> IsHitTestVisible Quizás esto también pueda ayudar …

Para resolver el problema, configure MouseOverBackColor en transparente para eliminar el fondo gris.