在.NET Winforms应用程序中创建图像按钮

时间:2011-01-25 16:21:04

标签: c# .net winforms button

我正在尝试在Visual Studio 2010中的.NET 4.0 Winforms应用程序中创建一个只有图像的按钮。我有一个无边框的窗口,并有一个背景图像,构成我的自定义皮肤为此应用程序。对于窗口右上角的关闭/最小化按钮,我想创建2个简单的按钮,这些按钮只是看起来像典型的Windows关闭/最小化按钮的图像。

我可能会错误地提出这个设计,所以如果我愿意,请告诉我。到目前为止,我已经确定我需要为Button创建一个仅渲染图像的子类。最终实现需要为每个按钮状态(正常,悬停,单击等)呈现不同的图像。以下是我到目前为止的情况:

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

此时,假设此设计合适,我需要知道如何正确调用SetClientSizeCore()。在构造函数中调用它会引发异常。我认为这是因为控件还没有机会进行初始化。我不确定要覆盖哪个函数会允许我在.NET初始化之后更改按钮的大小以适合图像。关于这个的任何想法?

2 个答案:

答案 0 :(得分:8)

在构造函数中,BackgroundImagenull

您需要通过覆盖属性来设置更改BackgroundImage时的大小。

您还应该隐藏Size属性并添加[DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)]以防止设计人员保存大小。

答案 1 :(得分:1)

等到分配了BackgroundImage属性,这样您就可以知道所需的大小。像这样覆盖属性:

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