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

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

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

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()。 在构造函数中调用它会引发exception。 我认为这是因为控件还没有机会进行初始化。 我不确定要覆盖哪个函数,这将允许我在.NET初始化后更改按钮的大小以适合图像。 有什么想法吗?

在构造函数中, BackgroundImagenull

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

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

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

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