Событие при наведении курсора некорректно запускается

2

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

По какой-то причине, когда я нажимаю кнопку в моем приложении С# forms, это вызывает сброс в моем коде. Мне кажется странным, учитывая, что на кнопке на самом деле нет событий наведения. Я даже попробовал добавить еще одну кнопку, и даже когда я ничего не делаю с ней, зависание все еще вызывает сброс.

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

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

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;
        }
    }
}

Изображение 174551

  • 0
    Добро пожаловать в стек переполнения . Я взял на себя смелость удалить тег visual-studio потому что этот тег предназначен для вопросов о самой Visual Studio (в отличие от кода, который вы пишете с использованием VS).
  • 0
    Вероятно, это событие Paint, когда оно вспыхнуло. Это где "сброс" происходит?
Показать ещё 1 комментарий
Теги:
winforms

2 ответа

0

Я собираюсь предположить, что это ваше событие MainForm_Paint. Это событие запускается всякий раз, когда форма рисуется или перерисовывается, и включает в себя что-либо на ней. Когда ваша мышь нависает над элементом, ее нужно перерисовать.

    private void MainForm_Paint(object sender, PaintEventArgs e)
    {
        g = e.Graphics; // THIS LINE is probably causing the reset - you're resetting the graphics object here
        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();
    }

Позже в коде у вас есть строка:

    g = this.CreateGraphics();

Это срабатывает в Timer_Tick событий Timer_Tick, но g перезаписывается каждый раз, когда Mainform_Paint запускается при наведении курсора.

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

0

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

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

SpeedTimer.Start();

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

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

  • 0
    Спасибо, что приложили усилия, чтобы ответить! Действительно ценю это. На самом деле мне не понравилось то, что происходило, так что это здорово, чтобы исправить это.
  • 0
    Спасибо и добро пожаловать в Stack OVerflow! Если это ответило на ваш вопрос, пометьте его как правильный ответ и, если хотите, добавьте ответ. Это помогает мне и улучшает это для других, которые могут прийти в будущем, ища похожие ответы. Удачи в ваших приключениях программирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню