Создание кнопки изображения в приложении .NET Winforms - PullRequest
8 голосов
/ 25 января 2011

Я пытаюсь создать кнопку в моем приложении .NET 4.0 Winforms в Visual Studio 2010, которая является ТОЛЬКО изображением.У меня есть окно без полей и фоновое изображение, которое составляет мой собственный скин для этого приложения.Для кнопок закрытия / сворачивания в правом верхнем углу окна я хотел создать 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.Есть идеи по этому поводу?

Ответы [ 2 ]

8 голосов
/ 25 января 2011

В конструкторе BackgroundImage равно null.

Вам необходимо установить размер при изменении BackgroundImage путем переопределения свойства.

Вы также должны затенять свойство Size и добавить [DesignerSerializationVisibilty(DesignerSerializationVisibility.Hidden)], чтобы предотвратить сохранение размера дизайнером.

1 голос
/ 25 января 2011

Подождите, пока не будет назначено свойство BackgroundImage, чтобы вы знали, какой размер вам нужен.Переопределите свойство следующим образом:

public override Image BackgroundImage {
    get { return base.BackgroundImage; }
    set {
        base.BackgroundImage = value;
        if (value != null) this.Size = value.Size;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...