#c# #forms
#c# #формы
Вопрос:
вопрос, кратко изложенный в названии, уже звучит плохо. В любом случае, я пытался получить координаты мыши в приложении C # form, и это очень просто сделать, используя встроенную функцию OnMouseMove. Проблема в том, что когда в приложении формы есть поле с картинками, функция не может получить координаты, потому что окно с картинками не выбирается! Я имею в виду, что курсор не указывает на части, которые блокируются окном picturebox!
Я пытался также использовать
private void drawbox_MouseUp(object sender, MouseEventArgs e)
{
x2 = e.X;
y2 = e.Y;
label6.Location = new Point(x2, y2);
base.OnMouseMove(e);
}
но безуспешно.
Я искал проблему, но не смог найти исправления. Пожалуйста, помогите.
Для вашей информации, я использую следующую функцию для получения координат мыши:
protected override void OnMouseMove( MouseEventArgs e)
{
x2 =e.X;
y2 = e.Y;
label6.Location = new Point(x2, y2);
base.OnMouseMove(e);
//base.OnMouseMove(e);
}
Комментарии:
1. вы хотите, чтобы точка мыши находилась внутри picturebox (относительно picturebox), или когда мышь проходит над picturebox, захватывалась точка относительно формы?
2. Привет, спасибо за быстрый ответ, drawbox — это экземпляр picturebox, и, честно говоря, мне понадобится положение в обоих случаях, как для picturebox, так и для form. Что я хочу сделать позже, так это нарисовать некоторые объекты, а затем сохранить изображение.
Ответ №1:
Я думаю, это поможет вам. Я размещаю информацию об этом.Текст просто для демонстрации:
private void drawbox_MouseMove(object sender, MouseEventArgs e)
{
Point p = e.Location;
Point formpoint = PointToClient(MousePosition);
this.Text = formpoint.ToString() " - " p.ToString();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
this.Text = e.Location.ToString();
}
Ответ №2:
@christophos Вот весь мой код, он не такой длинный. Я написал это для тестирования и, к сожалению, по-прежнему «label6» не перемещается по моему picturebox «drawbox». Это то, что я изначально сделал, это отлично работает, если нет picturebox.
public partial class Form1 : Form
{
Graphics drawingarea;
int x1, y1,x2,y2 = 0;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool GetCursorPos(ref Point lpPoint);
public Form1()
{
InitializeComponent();
drawingarea = drawbox.CreateGraphics();
}
private void button1_Click(object sender, EventArgs e)
{
Pen blackpen = new Pen(Color.Black);
x1 = Convert.ToInt32(textBox1.Text);
y1 = Convert.ToInt32(textBox2.Text);
//x2 = Convert.ToInt32(textBox3.Text);
//y2 = Convert.ToInt32(textBox4.Text);
drawingarea.DrawLine(blackpen, x1, y1, x2, y2);
}
protected override void OnMouseMove( MouseEventArgs e)
{
Point p = GetCursorPosition();
x2 = p.X;
y2 = p.Y;
label6.Location = new Point(x2, y2);
base.OnMouseMove(e);
}
public static Point GetCursorPosition()
{
Point p = new System.Drawing.Point(0, 0);
GetCursorPos(ref p);
return p;
}
}
Ответ №3:
Я предлагаю вам использовать для этого вызов API — некоторое время назад я реализовал следующий код в классе многократного использования, и он отлично сработал.
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);
public static System.Drawing.Point GetCursorPosition()
{
System.Drawing.Point p = new System.Drawing.Point(0, 0);
GetCursorPos(ref p);
return p;
}
Назовите это следующим образом:
Point p = GetCursorPos();
Это должно задать положение относительно формы. Если вам нужна позиция picturebox, добавьте верхнюю и левую координаты поля к координатам X и Y в p (соответственно).
РЕДАКТИРОВАТЬ: вызов был неправильным.
РЕДАКТИРОВАТЬ 2: Из-за проблемы невозможности зафиксировать положение мыши над PictureBox, просто отправьте событие MouseMove PictureBox в форму.
Выберите поле с картинками в конструкторе, затем откройте события (молния). Щелкните один раз на пустом поле рядом с MouseMove, затем либо:
-
Дважды щелкните, чтобы создать метод-обработчик, и вызовите свой метод OnMouseMove оттуда
или
-
Измените свой метод OnMouseMove, чтобы у него была эта подпись:
private void OnMouseMove(object sender, MouseEventArgs e)
Комментарии:
1. Я не хочу критиковать, но чего я не понимаю, так это того, что GetCursorPosition() не вызывается. Спасибо!
2. Вам нужно будет вызвать это в вашем OnMouseMove, затем использовать.x и . это похоже на то, что вы делаете с MouseEventArgs.
3. Это весь мой код формы, я создал его для проведения некоторых тестов.
4. Удалите базу. Включите mousemove(e); в вашем коде и измените строки x1 = Convert и y1 = Convert в int. Попробуйте проанализировать(TextBox1.Text, вывод x1); int. Попробуйте проанализировать (TextBox2.Text, вывод y1);