MouseUp и MouseDown всегда имеют одного и того же отправителя объекта
Я пытаюсь сделать клона тральщика, и у меня проблемы с мышью. Если я нажимаю кнопку мыши в окне рисунка, а затем перемещаю мышь в другое поле, событие mouseup будет иметь того же отправителя объекта, даже если это происходит в другом элементе управления.
Мне нужно событие mousedown, чтобы я мог видеть, были ли нажаты обе кнопки мыши, к сожалению, событие mouseup, похоже, не заботится о том, где находится курсор, когда я отпускаю кнопку.
Если я не выражаюсь ясно, думаю, тральщик. Я хочу иметь возможность щелкать левой кнопкой мыши, щелкать правой кнопкой мыши, щелкать оба вместе, а также иметь возможность перемещать курсор после нажатия вниз и открывать плитку там, где я ее отпускаю.
У кого-нибудь есть какие-либо идеи?
3 ответа
Мне удалось выяснить кое-что, что поможет, оставлю это здесь, если кому-то еще это понадобится в будущем.
private void MouseUp(object sender, MouseEventArgs e)
{
Point ptCursor = Cursor.Position;
ptCursor = PointToClient(ptCursor);
PictureBox pBox = (PictureBox)GetChildAtPoint(ptCursor);
pBox.BackColor = System.Drawing.Color.Blue;
}
Я установил простую форму с некоторыми картинками, и когда происходит событие mouseup, он проверяет элемент управления в позиции курсора, и вы можете использовать его для своих нужд. Проблема, с которой я столкнулся, заключалась в том, что событие mouseup было связано с элементом управления, где произошло событие mousedown, и поэтому я не мог получить доступ к элементу управления, в котором находился курсор, когда произошло событие mouseup.
Я программировал только около 4 недель, так что это решение может быть очень ошибочным, поэтому, если есть какие-то проблемы с ним, некоторые отзывы будут отличными.
Лично я делаю это, имея переменную Point уровня формы, которую я обновляю при каждом событии MouseMove. Затем, когда происходят другие события мыши, они имеют последние доступные.
Я бы сделал так:
- Создайте подклассные кнопки, которые будут содержать игровые активы в качестве картинки.
- Создайте пользовательский элемент управления и добавьте столько необходимых кнопок
- По щелчку мыши я бы проверил
Contains
методBounds
чтобы увидеть, произошло ли нажатие на эту конкретную кнопку, или другим способом обработать нажатие кнопки внутри пользовательского элемента управления.
Было бы лучше, если бы мы увидели часть вашего кода и, возможно, скриншот.
Обновить:
Это пример того, как обрабатывать клики, используя делегатов.
public partial class MineSweeper : UserControl
{
public MineSweeper()
{
InitializeComponent();
}
private void MineSweeper_Load(object sender, EventArgs e)
{
this.BackColor = Color.Red;
for (int i = 0; i < 16; i++)
{
var button = new Button();
button.Name = "Button" + i;
button.Size = new Size(50, 50);
button.ForeColor = Color.Yellow;
button.ForeColor = Color.Black;
button.Click += delegate
{
MessageBox.Show("You have clicked me! I am " + button.Name);
};
flowLayoutPanel1.Controls.Add(button);
flowLayoutPanel1.Invalidate();
}
this.Invalidate();
}
}
Просто добавьте новый UserControl от дизайнера, добавьте к нему flowLayoutPanel и установите его свойство dock на full.
[VS 2017 C#] Использование MouseEventArgs
для положения мыши при нижнем / верхнем положении мыши работает только тогда, когда точка захватывается левой кнопкой мыши, как показано ниже.
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//??? this changes at UP time and becomes same as MouseArgsUpPoint
//MouseArgsDownPoint = new Point(e.X, e.Y);
//same as above, MouseArgsDownPoint = PointToClient(MousePosition);
if (e.Button == MouseButtons.Left)
{
//inside here it works fine and Up/Down points are different and correct
MouseArgsDownPoint = new Point(e.X, e.Y);
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
MouseArgsUpPoint = new Point(e.X, e.Y);
}