2008-10-12 17 views
8

Estoy tratando de 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.Botón personalizado en C#: cómo quitar el fondo de desplazamiento?

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 funciona, 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?

Respuesta

11

El fondo gris se debe a la configuración de "System.Windows.Forms.FlatStyle.Flat", es el comportamiento predeterminado, ya que es necesario resaltar el botón al desplazarse. 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 establecer "habilitado" en MouseHover, debe 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 cada entrada/salida. Donde, como MouseHover, se dispara cada vez que el mouse se movía dentro del botón, lo que crea una configuración repetida de "haz habilitado".

+1

Gracias por la sugerencia de MouseEnter, ¡eso resolvió mi problema de BackColor-change-slowness! – TechNyquist

2

Lo he resuelto 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: observe que estoy usando ahora un botón de dos estados, en lugar de tres. Está destinado (sé que aún puedo usar tres).

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

crear Mouse Introduzca el evento 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; 
} 

asigne este evento a todos los botones.

feliz :) programación

0

También puede dejar de cambiar el color del botón anulando la selección de la opción IsHitTestVisible en Propiedades del botón>> IsHitTestVisible comunes Tal vez esto también puede ayudar ...

2

he conseguido 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) 

PS: Usted no será capaz de utilizar el evento MouseEnter fuera de la clase derivada (por ejemplo, un proyecto utilizando este control)

1

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

  1. Establecer el botón de FlatStyle a Flat

    this.btnClose.FlatStyle = FlatStyle.Flat; 
    
  2. Ajuste del botón MouseOverBackColor a transparente

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

Esperamos que esto ayude.Gracias

-1

Para solucionar el problema, configure MouseOverBackColor en transparente para quitar el fondo de color gris.

Cuestiones relacionadas