我正在尝试在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初始化之后更改按钮的大小以适合图像。关于这个的任何想法?
答案 0 :(得分:8)
在构造函数中,BackgroundImage
为null
。
您需要通过覆盖属性来设置更改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;
}
}