2011-01-25 98 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; 
    } 
} 
相關問題