Новое для, так что кто-то знает, что здесь происходит.
По какой-то причине, когда я нажимаю кнопку в моем приложении С# 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;
}
}
}
Я собираюсь предположить, что это ваше событие 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
запускается при наведении курсора.
Извините, но я не ответил на вопрос, почему это происходит. Надеюсь, с этой информацией вы можете внести некоторые изменения, чтобы исправить проблему.
Хорошо, мой первый ответ был совершенно неправильным, должен был прочитать вопрос неправильно, извините.
Тем не менее, ответ по-прежнему относится к вашему событию MainForm_Paint
. Это событие запускается всякий раз, когда форма нарисована или перерисована, и включает в себя что-нибудь на нем (например, ваши кнопки). Когда ваша мышь нависает над элементом, ее нужно перерисовать, как и любого из ее родителей, прямо на уровень формы. Это также происходит, если форма изменяется, возвращается после того, как она скрыта (частично или полностью), выходит из экрана и возвращается, и т.д. И т.д. Множество разных вещей вызовет событие формы Paint
. И в вашем событии MainForm_Paint
вас есть эта строка:
SpeedTimer.Start();
... который заставляет таймер запускаться, и все начинается снова и снова.
Вместо использования MainForm_Paint
я бы предположил, что вы используете форму Load
event для установки всех этих начальных условий. Это будет срабатывать только после того, как форма будет инициализирована и отобразится на экране.
visual-studio
потому что этот тег предназначен для вопросов о самой Visual Studio (в отличие от кода, который вы пишете с использованием VS).