Как постепенно изменить размер изображения?

Я пытался закодировать это некоторое время, и после пары недель поиска в Интернете ответа я решил спросить

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

Также мне нужно, чтобы он постепенно возвращался к исходному размеру, как только мышь перемещалась от pictureBox1.

Я играл с парой решений, найденных на веб-сайтах, но ни одно из них, похоже, не работает должным образом, также вам может понадобиться знать, что у меня есть две формы, задействованные в этом коде; Form1 и frmMenu и из-за массы ошибок я закомментировал два нижних метода.

Я не получаю никаких ошибок, но это просто не работает.

public partial class frmMenu : Form
{
    //private int size = 100;

    public Timer timer1;



    public frmMenu()
    {
        InitializeComponent();
        pictureBox1.MouseEnter += new EventHandler(pictureBox1_MouseEnter);
        //pictureBox1.MouseLeave += new EventHandler(pictureBox1_MouseLeave);  

    }

    private string frmMenu_Load
    {
        set
        {
            timer1.Interval = 1;
        }
    }

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {

        //for (int i = 140; i > size; size++)
        //{
        //}
        {
            timer1.Interval = 1;
        }
        timer1.Enabled = true;

        if (pictureBox1.Height <= 140)
        {
            pictureBox1.Size = new Size(pictureBox1.Size.Width, pictureBox1.Size.Height + 1);
        }
        else
        {
            timer1.Enabled = false;
        }

    }




//    private void pictureBox1_MouseLeave(object sender, EventArgs e)
//    {
//        if (size > 100)
//            for (int i = size; i > 100; i--)
//            {
//                size = i;
//            }
//        pictureBox1.Height = pictureBox1.Width = size;
//    }

//    private void pictureBox1_Click(object sender, EventArgs e)

//    {
//        var Form1 = new Form1();
//        Form1.Show();

//        var Menu = new frmMenu();
//        Menu.Close();
//    }
}

Это мой первый вопрос, так что извините, если я не дал достаточно информации ^.^


person ThomasIS123    schedule 07.01.2014    source источник


Ответы (1)


Попробуйте этот код:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        bool mouseHover;
        int width;
        int height;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 25;
            timer1.Tick += timer1_Tick;
            width = pictureBox1.Width;
            height = pictureBox1.Height;
            timer1.Start();
        }

        void timer1_Tick(object sender, EventArgs e)
        {
            if (mouseHover)
            {
                pictureBox1.Width += (pictureBox1.Width < 100) ? 5 : 0;
                pictureBox1.Height += (pictureBox1.Height < 100) ? 5 : 0;
            }
            else
            {
                pictureBox1.Width += (pictureBox1.Width > width) ? -5 : 0;
                pictureBox1.Height += (pictureBox1.Height > height) ? -5 : 0;
            }
        }

        private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {            
            mouseHover = true;
        }

        private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            mouseHover = false;
        }
    }
}

Вы можете настроить интервал по своему усмотрению, но увеличение на 5 пикселей по горизонтали/вертикали каждые 25 миллисекунд довольно плавно. Вам нужно установить начальную высоту и ширину, чтобы вы могли вернуться к этому размеру после того, как мышь покинет поле изображения. Я использую оператор объединения null, поэтому вам не нужно останавливать таймер. Пока условие слева от ? истинно, оно будет оцениваться как значение слева от :. Когда условие ложно, оно вычисляется справа от :.

person Cameron Tinker    schedule 07.01.2014
comment
Большое спасибо, я забыл добавить новые обработчики событий и таймер, но после этого все заработало отлично! - person ThomasIS123; 08.01.2014