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

voi*_*ter 8 .net c# button winforms

我正在尝试在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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 8

在构造函数中,BackgroundImagenull.

您需要BackgroundImage通过覆盖属性来更改大小.

您还应该遮蔽Size属性并添加[DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)]以防止设计者保存大小.