2017-07-13 59 views
3

我已经构建了一个简单的程序(到目前为止),该程序有一个大面板作为程序的“WorkArea”。我在上面画一个网格,有一些功能可以将光标对准网格上的最近点。我在窗口底部有一个状态栏,它显示了我在面板上的当前位置。但是,无论我在哪里滚动(假设垂直条相对于顶部为10%,水平为25%),它会显示与实际窗口相关的光标位置。获取光标在滚动条面板上的位置

我有一个处理这个事件的OnMouseMove:

private void WorkArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    GridCursor = grid.GetSnapToPosition(new Point(e.X, e.Y)); 
    toolStripStatusLabel1.Text = grid.GetSnapToPosition(new Point(e.X, e.Y)).ToString(); 
    Refresh(); 
} 

它的工作原理,我期望得到光标的点,它绘制到正确的地方,等等。但是,如果我滚动出来,我仍然可以得到相同的读数。我可以在垂直和水平滚动条中间滚动一半,将光标放在左上角,读取0,0,当它应该更像5000,5000(面板10k乘10k) 。

如何才能获得关于其滚动条的面板内的绝对位置?

+0

所以'WorkArea'是一个面板,对吗?什么是'GridCursor','Grid','GetSnapToPosition'。 AutoScroll是否打开? – TaW

回答

1

您需要通过滚动位置偏移的位置:

private void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
     Point scrolledPoint = new Point(e.X - panel1.AutoScrollPosition.X, 
             e.Y - panel1.AutoScrollPosition.Y); 

     .. 
} 

请注意,AutoScrollPosition个值为负..:检索

X和Y坐标值是负如果控制 已滚动从它的起始位置(0,0)的距离。当您设置此属性时,您必须始终分配正X和Y值以设置相对于起始位置的滚动位置 。例如,如果您的 具有水平滚动条,并且您将x和y设置为200,则将向右移动200像素的 ;如果您随后将x和y设置为100,则 滚动会显示为向左跳100像素,因为您将它设置为 ,它距离起始位置100个像素。在第一种情况下, AutoScrollPosition返回{-200,0};在第二种情况下,它返回 {-100,0}。

+0

这样做的伎俩,谢谢! – Zulukas

0

的WinForms:

的方法Control.PointToClient,您可以相对于控制自身的鼠标位置转换。

Point point = grid.PointToClient(new Point(e.X, e.Y)) 

WPF:

使用Mouse.GetPosition可以得到鼠标相对于到特定控制的位置:

Point position = Mouse.GetPosition(grid); 
+0

从外观来看,这只是WPF。有没有办法与WinForms做到这一点?我看到了“Cursor.Current”的效果,但我似乎无法找到任何有关如何使用此对象的信息(只是试图让Point对象脱离它) – Zulukas

+0

啊,错过了你的winforms标签,添加了独立解决方案 – Chrille

相关问题