2011-01-25 24 views
7

Estoy tratando de crear un botón en mi aplicación .NET 4.0 Winforms en Visual Studio 2010 que SÓLO es una imagen. Tengo una ventana que no tiene bordes y una imagen de fondo que conforma mi máscara personalizada para esta aplicación. Para los botones de cerrar/minimizar en la parte superior derecha de la ventana, quería crear 2 botones simples que son solo imágenes que se parecen a los típicos botones de cerrar/minimizar de Windows.Creando un botón de imagen en la aplicación .NET Winforms

Tal vez me esté yendo mal este diseño, así que si estoy por favor hágamelo saber. Hasta ahora, he determinado que necesito crear una subclase para Button que solo represente la imagen. La implementación final necesita generar imágenes diferentes para cada estado de botón (normal, desplazado, cliqueado, etc.). Aquí es lo que tengo hasta ahora:

public class ImageButton : Button 
{ 
    Pen pen = new Pen(Color.Red, 1.0f); 

    public ImageButton() 
    { 
     SetClientSizeCore(BackgroundImage.Width, BackgroundImage.Height); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.DrawImage(BackgroundImage, 0, 0); 
     //e.Graphics.DrawRectangle(pen, ClientRectangle); 
     //Rectangle bounds = new Rectangle(0, 0, Width, Height); 
     //ButtonRenderer.DrawButton(e.Graphics, bounds, PushButtonState.Normal); 
     //base.OnPaint(pevent); 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     // Do nothing 
    } 
} 

En este punto, suponiendo este diseño es apropiado, necesito saber cómo llamar SetClientSizeCore() adecuadamente. Llamarlo al constructor genera una excepción. Supongo que esto se debe a que el control aún no se ha podido inicializar. No estoy seguro de qué función sobrescribir que me permita cambiar el tamaño de mi botón para que se ajuste a la imagen después de que .NET la haya inicializado. Alguna idea sobre esto?

+1

Sólo ha de intentar esto mismo, pero se dio cuenta de que una solución más simple sería utilizar un control PictureBox en su lugar, ya que tiene un evento de clic, y no había otra cosa que necesitaba particular desde el objeto del botón. – Ted

Respuesta

7

En el constructor, BackgroundImage es null.

Debe cambiar el tamaño cuando BackgroundImage se modifica anulando la propiedad.

También debe sombrear la propiedad Size y agregar [DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)] para evitar que el diseñador guarde el tamaño.

+1

Especialmente el elemento DesignerSerializationVisibility ... Estoy seguro de que muchos omiten esa parte. – DRapp

+0

Cuando dice 'sombrear' la propiedad Tamaño, quiere decir volver a implementarlo y reenviar get/set a la base. ¿Tamaño? No es virtual, así que no puedo anularlo utilizando los mismos medios que BackgroundImage. –

+0

@Bob: Sí, usando el modificador 'new'. – SLaks

1

Espere hasta que se asigne la propiedad Imagen de fondo para que sepa qué tamaño necesita. Reemplazar la propiedad como esta:

public override Image BackgroundImage { 
    get { return base.BackgroundImage; } 
    set { 
     base.BackgroundImage = value; 
     if (value != null) this.Size = value.Size; 
    } 
} 
Cuestiones relacionadas