Zul*_*kas 5 c# scroll winforms
我已经构建了一个简单的程序(到目前为止),它有一个大面板作为程序的“工作区”。我在上面画了一个网格,有一些功能可以将光标捕捉到网格上最近的点等。窗口底部有一个状态栏,显示我在面板上的当前位置。然而,无论我滚动到哪里(假设垂直条相对于顶部为 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();
}
Run Code Online (Sandbox Code Playgroud)
它的工作方式正如我所期望的那样给出光标的点,将其绘制到正确的位置,等等。但是,如果我向外滚动,我仍然会得到相同的读数。我可以在垂直和水平滚动条上滚动一半,将光标放在左上角,然后读取 0,0,此时它应该更像 5000,5000(在 10k x 10k 的面板上) 。
如何获得面板内相对于滚动条的绝对位置?
您需要通过滚动位置来偏移该位置:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
Point scrolledPoint = new Point( e.X - panel1.AutoScrollPosition.X,
e.Y - panel1.AutoScrollPosition.Y);
..
}
Run Code Online (Sandbox Code Playgroud)
请注意,AutoScrollPosition值为负数......:
如果控件已滚动远离其起始位置 (0,0),则检索到的 X 和 Y 坐标值为负值。设置此属性时,必须始终指定正的 X 和 Y 值以设置相对于起始位置的滚动位置。例如,如果您有一个水平滚动条,并且将 x 和 y 设置为 200,则滚动条将向右移动 200 个像素;如果您随后将 x 和 y 设置为 100,则滚动看起来会向左跳跃 100 像素,因为您将其设置为距起始位置 100 像素。在第一种情况下,AutoScrollPosition 返回 {-200, 0};在第二种情况下,它返回{-100,0}。