Использование события mouseEnter для масштабирования кнопки - PullRequest
2 голосов
/ 21 января 2012

это мой первый пост здесь. Прежде всего, немного истории, я новичок в C # и буквально на стадии прорезывания зубов. Я инженер-химик и в основном имею опыт работы с такими языками, как MATLAB и Mathematica, но мне всегда нравилось программирование, и я решил изучить C #, чтобы создать дружественные интерфейсы для некоторых программ, которые я использовал. Обратите внимание, что я использую формы Windows, а не WPF.

То, что я хотел бы сделать, это иметь экран главного меню со ссылками на различные формы. Теперь, чтобы это выглядело лучше, я хочу вот что; когда я нахожу курсор над картинкой (изображение кнопки) в главном окне, я бы хотел, чтобы кнопка немного «росла», а затем, когда я ее оставляю, должна «сжиматься» до ее первоначального размера. До сих пор мой метод состоял в том, чтобы попытаться загрузить gif этой анимации роста в событие mouseEnter, а затем загрузить анимацию сокращения в mouseLeave, но это просто зацикливает соответствующий gif снова и снова. Как я могу получить GIF, чтобы играть только один раз?

Я пытался загружать кадры последовательно с нитью сна между ними, но все, что я вижу, когда делаю это, это последнее изображение, которое я пытаюсь загрузить. Вот пример кода, используемого для этого метода, где я пытаюсь показать одно изображение, а затем показать другое через 0,1 секунды

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        ((PictureBox)sender).Image =Image.FromFile("C:/Users/michael/Desktop/131.bmp");

        Thread.Sleep(100);
        ((PictureBox)sender).Image = Image.FromFile("C:/Users/michael/Desktop/131a.bmp");
    }

Также есть ли способ сделать это без GIF, например, с помощью цикла for для увеличения размера кнопки или Picturebox?

РЕДАКТИРОВАТЬ 1: куда я помещаю остановку таймера, чтобы при запуске второй анимации остановилась первая?

      private void pictureBox1_MouseEnter(object sender, EventArgs e)
       {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        Timer timeraf = new Timer();
        timeraf.Interval = 10;
        timeraf.Tick += new EventHandler(timerAfwd_Tick);
        timeraf.Start();
     }

   private void pictureBox1_MouseLeave(object sender, EventArgs e)
    {

        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        Timer timerab = new Timer();
        timerab.Interval = 10;
        timerab.Tick += new EventHandler(timerAbwd_Tick);
        timerab.Start();
    }

1 Ответ

1 голос
/ 21 января 2012

Если вы отключите основной поток, я уверен, что он блокирует пользовательский ввод и блокирует поток, который обрабатывает рисование. Таким образом, ваше изображение не может рисовать анимацию. Попробуйте использовать таймер, как это:

public partial class Animation : Form
{
    Image img1 = Properties.Resources.img1;
    Image img2 = Properties.Resources.img2;
    Image img3 = Properties.Resources.img3;

    List<Image> images = new List<Image>();
    Timer timer = new Timer();

    public Animation()
    {
        InitializeComponent();

        timer.Interval = 250;
        timer.Tick += new EventHandler(timer_Tick);

        images.Add(img1);
        images.Add(img2);
        images.Add(img3);

        animated_pbx.Image = img1;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler(timer_Tick));
        }
        else
        {
            // Loop through the images unless we've reached the final one, in that case stop the timer
            Image currentImage = animated_pbx.Image;
            int currentIndex = images.IndexOf(currentImage);

            if (currentIndex < images.Count - 1)
            {
                currentIndex++;

                animated_pbx.Image = images[currentIndex];

                animated_pbx.Invalidate();
            }
            else
            {
                timer.Stop();
            }
        }
    }

    private void animated_pbx_MouseEnter(object sender, EventArgs e)
    {
        timer.Start();
    }

    private void animated_pbx_MouseLeave(object sender, EventArgs e)
    {
        timer.Stop();
        animated_pbx.Image = img1;
        animated_pbx.Invalidate();
    }
}

РЕДАКТИРОВАТЬ: Изменен код для добавления анимации при наведении курсора на PictureBox. Анимация останется в последнем кадре, пока вы будете зависать. Когда мышь уходит, она сбрасывается в 1-й кадр. Вы можете использовать любое количество кадров. Вы также должны обработать MouseDown и MouseUp и создать еще 1 изображение, чтобы показать подавленное состояние или состояние «вниз».

...