2011-01-25 59 views
7

我想在Visual Studio 2010中的.NET 4.0 Winforms应用程序中创建一个按钮,这是一个图像。我有一个无边界的窗口,并且有一个背景图像组成了我的自定义外观。对于窗口右上角的关闭/最小化按钮,我想创建2个简单的按钮,这些按钮只有像典型的Windows关闭/最小化按钮的图像。在.NET中创建一个图像按钮Winforms应用程序

我可能会讨论这个设计错误,所以如果我请让我知道。到目前为止,我已经确定我需要为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初始化后的大小。对此有何想法?

+1

就被这个试图自己,但认识到,一个简单的解决方法是使用一个PictureBox控件,而不是,因为它有一个click事件,而且没有别的,我需要特别从按钮对象。 – Ted 2012-09-13 13:25:37

回答

7

在构造函数中,BackgroundImagenull

您需要通过覆盖属性来更改BackgroundImage时的尺寸。

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

+1

特别是DesignerSerializationVisibility元素......我相信很多人会错过这个部分。 – DRapp 2011-01-25 17:10:27

1

等到BackgroundImage属性被分配,这样你就会知道你需要什么尺寸。覆盖这样的特性:

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