Событие при наведении курсора некорректно запускается - PullRequest
0 голосов
/ 06 декабря 2018

Новое в переполнении стека, поэтому надеемся, что кто-то знает, что здесь происходит не так.

По какой-то причине всякий раз, когда я нахожу курсор мыши на кнопке в моем приложении c # form, это вызывает сброс в моем коде.Это кажется мне странным, учитывая, что у меня на самом деле нет никаких событий при наведении курсора на кнопку.Я даже пытался добавить еще одну кнопку, и даже когда я ничего не делал с ней, зависание по-прежнему вызывает сброс.

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

Он делает это правильно, но он также начинает заполняться снова, когда я наводю курсор на кнопку.

namespace Assignment5A
{
    public partial class MainForm : Form
    {
        public float streamHeight = 370;
        public float lastWaterHeight = 0;
        public float waterHeight = 0;
        public float waterBottom = 500;
        public float fillSpeed = 300;

        public Color brushColor = Color.LightBlue;
        public Graphics g;
        public Pen pen;
        public Brush brush = new SolidBrush(Color.LightBlue);

        public MainForm()
        {
            InitializeComponent();
            this.Width = 500;
            this.Height =600;
            this.BackColor = Color.Black;
            SpeedTimer.Interval = (int)fillSpeed;
        }

        private void MainForm_Paint(object sender, PaintEventArgs e)
        {
            g = e.Graphics;
            pen = new Pen(Color.White);
            g.DrawLine(pen, 50, 200, 50, 500);
            g.DrawLine(pen, 350, 200, 350, 500);
            g.DrawLine(pen, 50, 500, 350, 500);

            SpeedTimer.Start();
        }

        private void SpeedTimer_Tick(object sender, EventArgs e)
        {
            if (waterHeight < 270)
            {
                brush = new SolidBrush(brushColor);
                g = this.CreateGraphics();

                g.FillRectangle(brush, 108, 136, 20, waterBottom - 136 - waterHeight);
                waterHeight += 1f;
                g.FillRectangle(brush, 51, waterBottom - waterHeight, 299, waterHeight - lastWaterHeight);
                lastWaterHeight = waterHeight;
            }
            else
            {
                SpeedTimer.Stop();
                waterHeight = 0;
                lastWaterHeight = 0;
                brush = new SolidBrush(Color.Black);
                g.FillRectangle(brush, 51, 136, 299, 364);
            }
        }

        private void Speed_Scroll(object sender, EventArgs e)
        {
            if (waterHeight < 270)
            {
                float scrollValue = Speed.Value;
                fillSpeed = 300 / scrollValue;
                SpeedTimer.Interval = (int)fillSpeed;
            }
            else
            {
                brush = new SolidBrush(Color.Black);
                g.FillRectangle(brush, 51, 230, 299, 270);
                SpeedTimer.Start();
            }
        }

        private void ColorButton_Click(object sender, EventArgs e)
        {
            SetColor.ShowDialog();
            brushColor = SetColor.Color;
        }
    }
}

enter image description here

1 Ответ

0 голосов
/ 06 декабря 2018

ОК, мой первый ответ был полностью неправильным, должно быть, прочитал вопрос неправильно, извините.

Хотя ответ все равно сводится к вашему MainForm_Paint событию.Это событие вызывается всякий раз, когда форма рисуется или перерисовывается, и включает в себя что-либо на нем (например, ваши кнопки).Когда ваша мышь наводит курсор на элемент, он должен быть перерисован, как и любой из его родителей, обратно на уровень формы.Это также происходит, если форма изменяется, возвращается в поле зрения после скрытия (частично или полностью), выходит за пределы экрана, возвращается и т. Д. И т. Д. И т. Д. Многие вещи вызывают событие формы Paint для запуска.И в вашем MainForm_Paint событии у вас есть эта строка:

SpeedTimer.Start();

..., которая запускает таймер и все начинается заново.

Вместо использования MainForm_PaintЯ бы, вероятно, предложил вам использовать событие Load формы для установки всех этих начальных условий.Он срабатывает только один раз после инициализации формы и отображается на экране.

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