获取相对于控件的光标位置 - C#

时间:2011-11-20 11:49:36

标签: c# winforms mouse mouse-position

我希望相对于存在鼠标指针的控件获得鼠标位置。这意味着当我将光标放在控件的起点(左上角)时,它应该给出(0,0)。我使用以下代码:

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = Convert.ToString(Cursor.Position.X + ":" + Cursor.Position.Y);         
    } 

但这使得屏幕的位置不受控制。

代码示例将不胜感激。

11 个答案:

答案 0 :(得分:40)

使用Control.PointToClient将点从屏幕相对坐标转换为控制相对坐标。如果您需要采用其他方式,请使用PointToScreen。

答案 1 :(得分:27)

您可以直接使用传递给事件处理程序的MouseEventArgs参数的Location属性。

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = e.Location.X + ":" + e.Location.Y;      
} 

答案 2 :(得分:15)

以下内容将为您提供相对于您的控件的鼠标坐标。例如,如果鼠标位于控件的左上角,则会产生(0,0):

var coordinates = yourControl.PointToClient(Cursor.Position);

答案 3 :(得分:3)

可以使用以下方法从绝对坐标和绝对坐标获取相对坐标:

Point Control.PointToClient(Point point);

Point Control.PointToScreen(Point point);

答案 4 :(得分:1)

只需从光标位置减去控件的Left和Top坐标:

this.Text = Convert.ToString(
    Cursor.Position.X - this.Left + ":" +
    Cursor.Position.Y - this.Top);

答案 5 :(得分:1)

我使用MouseLocation和PointToClient进行检查。然后在计时器中使用它!

scala> var mymap1 = MMap[Int, String](1->"one", 2->"two", 3->"three")
mymap1: scala.collection.mutable.Map[Int,String] = Map(2 -> two, 1 -> one, 3 -> three)

scala> import scala.collection.immutable.Map
import scala.collection.immutable.Map

scala> var mymap2 = Map[Int, String](1->"one", 2->"two", 3->"three")
mymap2: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> two, 3 -> three)

答案 6 :(得分:1)

Cursor.Position返回屏幕上的Point,但Control.PointToClient(Cursor.Position)返回控件上的点(例如control - > panel)。在你的情况下,你有e.Locate控制哪个返回点。

答案 7 :(得分:1)

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = panel1.PointToClient(Cursor.Position).ToString();    
} 

答案 8 :(得分:0)

private void lienzo_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
    Point coordenadas = new Point();
    coordenadas = Mouse.GetPosition(lienzo);

    string msg = "Coordenadas mouse :" + coordenadas.X + "," + coordenadas.Y;
    MessageBoxResult resultado;
    string titulo = "Informacion";
    MessageBoxButton botones = MessageBoxButton.OK;
    MessageBoxImage icono = MessageBoxImage.Information;

    resultado = MessageBox.Show(msg, titulo, botones, icono);
}

“lienzo”是我的画布面板

答案 9 :(得分:0)

代码段如下:

private void Control_MouseMove(object sender, MouseEventArgs e)
{
    var btn = sender as Button;
    var point = e.Location;
    point.X += btn.Location.X;
    point.Y += btn.Location.Y;

    Control findTarget = btn.Parent.GetChildAtPoint(point, GetChildAtPointSkip.Invisible) as Button;
    if (findTarget != null)
    {
        // TO DO
    }
}

该按钮是托管面板中许多按钮之一。

答案 10 :(得分:0)

创建标准项目C#WinForms

将2个分别名为X和Y的文本框以及一个Timer对象从工具箱放置到“设计”页面

按[F7],然后将所有代码替换为以下内容。

using System;
using System.Windows.Forms;

namespace MousePos
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }

        private void Form1_MouseCaptureChanged(object sender, EventArgs e)
        {
            X.Text = MousePosition.X.ToString();
            Y.Text = MousePosition.Y.ToString();
        }
    }
}

将Timer.Tick操作设置为“ Form1_MouseCaptureChanged”

[F5]运行-现在您有一个MosusePos应用程序。