Состояния графических кнопок в форме C # Windows - PullRequest
0 голосов
/ 09 августа 2009

Я строю форму окна в C # с VS2008. У меня около 32 кнопок, я поместил изображение поверх кнопок по умолчанию, но я хочу, чтобы для каждой из этих кнопок был эффект Hover / Up / Down, и я не могу найти эту информацию нигде.

Возможно, я ищу неправильные термины, приветствуется любое направление.

Ответы [ 5 ]

3 голосов
/ 09 августа 2009

Наследовать от класса System.Windows.Forms.Button и переопределять следующие методы:

  • OnMouseDown, это обрабатывает ваше "сжатое изображение"
  • OnMouseEnter, это обрабатывает ваше "изображение при наведении курсора"
  • OnMouseLeave, и это обрабатывает ваше исходное изображение

Код будет выглядеть примерно так:

public class MyButton : System.Windows.Forms.Button {
    public MyButton()
        : base() {
        // No default implementation
    }

    protected override void OnMouseDown(Object sender, MouseEventArgs e) {
        this.Image = Properties.Resources.PressedImage;
    }

    protected override void OnMouseEnter(Object sender, MouseEventArgs e) {
        this.Image = Properties.Resources.HoveringImage;
    }

    protected override void OnMouseLeave(Object sender, MouseEventArgs e) {
        this.Image = Properties.Resources.DefaultImage;
    }
}

Теперь, поскольку у вас есть несколько кнопок, вы, конечно, можете превратить приобретение ресурсов в свойства.

public Image DefaultImage {
    get;
    set;
}

public Image PressedImage {
    get;
    set;
}

public Image HoveringImage {
    get;
    set;
}

И используйте их в переопределенных, виртуальных методах. Это, вероятно, ваш лучший подход. Я хотел бы избежать ответа ниже (без обид, Phoexo), так как это очень необычное и грязное решение.

После того, как вы напишите и скомпилируете новую кнопку, вы сможете выполнить простой поиск и замену, чтобы изменить существующие типы кнопок. Вам нужно будет немного очистить и установить три свойства для каждой кнопки для соответствующих им изображений, а также очистить некоторый дизайнерский код, но это облегчит вашу жизнь в долгосрочной перспективе, если вы добавите больше кнопок.

1 голос
/ 09 августа 2009

Звучит как работа по наследству для меня. Я бы создал подкласс класса кнопок и обработал бы наведение, нажатие и выход, переопределив методы OnHover, OnPress, OnLeave и OnPaint. Занимайтесь рисованием кнопок в OnPaint.

0 голосов
/ 09 августа 2009

Используйте флажок или переключатель, а затем измените внешний вид на кнопку. Вы можете добавить изображение к флажку или переключателю, как обычная кнопка.

Настройка может быть установлена ​​в Designer или с помощью кода:

CheckBox checkBox = новый CheckBox (); checkBox.Appearance = Appearance.Button;

0 голосов
/ 09 августа 2009

Однажды я реализовал его во многом аналогично решению Дэвида Андерсона, но вел учет фактического состояния и переопределил метод OnPaint, чтобы нарисовать правильное изображение. Я не знаю, лучше ли это в любом случае, просто я так и сделал.

0 голосов
/ 09 августа 2009

Я создал программу, которая требовала этого с некоторыми метками, результат, который я придумал (добавьте AddHandles () - void в Form_Load):

    private void AddHandles()
    {
        foreach (Control c in this.Controls)
        {
            if (c.GetType() == typeof(Button))
            {
                c.MouseEnter += new EventHandler(ButtonEnter);
                c.MouseLeave += new EventHandler(ButtonLeave);
                c.MouseDown += new MouseEventHandler(ButtonDown);
                c.MouseUp += new MouseEventHandler(ButtonUp);
            }
        }
    }
    private void ButtonEnter(object sender, EventArgs e)
    {
        ((Button)sender).BackColor = Color.DarkGray;
        ((Button)sender).Cursor = System.Windows.Forms.Cursors.Hand;
    }
    private void ButtonLeave(object sender, EventArgs e)
    {
        ((Button)sender).BackColor = Color.Black;
        ((Button)sender).Cursor = System.Windows.Forms.Cursors.Default;
    }
    private void ButtonDown(object sender, MouseEventArgs e)
    {
        ((Button)sender).BackColor = Color.Gray;
    }
    private void ButtonUp(object sender, MouseEventArgs e)
    {
        ((Button)sender).BackColor = Color.Black;
        ((Button)sender).Cursor = System.Windows.Forms.Cursors.Default;

        //Code to be executed 
        //Use the name/text/etc of the Button to figure what to do...
    }

Обратите внимание, что я изначально использовал это с метками, поэтому могут потребоваться некоторые изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...