Hola a todos, escribo este post para explicar como evitar el efecto flicker.
El efecto flicker es ese que aparece a veces al pulsar un botón, y que parece que el boton parpadea o algo asi. Pues bien, la solucion es simple:
- Dibujarlo todo en el OnPaintBackground en vez de OnPaint, además, hay que quitar la línea base.OnPaintBackground(...) que te añade el propio VisualStudio.
Por ejemplo:
Código:
using System;
using System.Drawing;
using System.Windows.Forms;
public class ImageButton:Control
{
private Image UpImg;
private Image DownImg;
private bool pressed;
private bool release;
public ImageButton (bool autorelease):base()
{
release = autorelease;
this.pressed = false;
}
public bool Pressed
{
get{return pressed;}
set
{
this.pressed = value;
Invalidate();
}
}
public Image UpImage
{
get{return this.UpImg;}
set{this.UpImg = value;}
}
public Image DownImage
{
get{return this.DownImg;}
set{this.DownImg = value;}
}
protected override void OnMouseDown(MouseEventArgs e)
{
this.pressed = !this.pressed;
base.OnMouseDown (e);
this.Invalidate();
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (release)
{
this.pressed = false;
this.Invalidate();
}
base.OnMouseUp (e);
}
protected override void OnPaintBackground(PaintEventArgs e)
{
if (this.pressed==true && this.DownImg!=null)
e.Graphics.DrawImage(this.DownImg,0,0);
else
e.Graphics.DrawImage(this.UpImg,0,0);
}
}
Para el ejemplo de arriba, para utilizar el boton en question seria así:
Código:
public ImageButton ib_boton;
(...)
ib_boton= new ImageButton(true);
ib_boton.Bounds = new Rectangle(6,81,21,17); // Aqui lo ponemos donde queremos (en pixels)
ib_boton.UpImage = new Bitmap (asm.GetManifestResourceStream("upimage.bmp"));
ib_boton.DownImage = new Bitmap (asm.GetManifestResourceStream("downimage.bmp"));
Ala, yastá, simple pero efectivo
PD: Es que queda muy feo el efecto flicker... :P