【问题标题】:Mouse capturing when it's over line (Graphic.DrawLine())鼠标越线时捕获 (Graphic.DrawLine())
【发布时间】:2016-08-07 21:15:46
【问题描述】:

我想在位于PictureBox 的bmp 中用Graphic.DrawLine() 画一条线,我可以用鼠标移动它。我找不到任何功能来检查鼠标是否在线。我找到了很多方法来检查鼠标是否在Graphic.FillPolygon() 上,但没有关于DrawLine() 的方法。有什么好的办法来检查吗?

编辑: 所以根据建议我做了这样一个功能:

private bool IsPointInPolygon4(Point[] poly, Point p)
{
    System.Drawing.Drawing2D.GraphicsPath test = new System.Drawing.Drawing2D.GraphicsPath();
    if (poly.Length == 2) // it means there are 2 points, so it's line not the polygon
    {
        test.AddLine(poly[0], poly[1]);
        if (test.IsVisible(p, g))
        {
            MessageBox.Show("You clicked on the line, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            test.Dispose();
            return true;
        }
    }
    else
    {
        test.AddPolygon(poly);
        if (test.IsVisible(p, g))
        {
            MessageBox.Show("You clicked on the polygon, congratulations", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return true;
        }
    }
    return false;
}

它适用于多边形。但是我仍然无法在线获得鼠标事件。有什么建议吗?

【问题讨论】:

  • 它总是一条完美的水平线还是垂直线,没有其他角度?
  • 不,不幸的是它可以是任何角度,更重要的是,我想添加一个功能,当有人捕捉到顶点时改变角度

标签: c# winforms system.drawing


【解决方案1】:

你永远不能超过一条几何线,因为它没有维度。你只能让一个点成为线本身的一部分,但这是不可能的,除非你以无限的精度击中它(即使双打也不会在这里完成这项工作)。您可以在已为线绘制的像素上,但不一样。

你应该取两点的几何坐标和鼠标的坐标。然后计算鼠标点到直线的距离(这很容易,网上有很多文档)。

如果绝对距离小于阈值(1?1.5?2?),那么你就足够接近说“在线”了:

if (distance(px, py, qx, qy, mx, my) < 1.5)
{
    // on the line
}

distance() 的实现留给你。

【讨论】:

    【解决方案2】:

    由于您的线可以是 0 度和 90 度以外的角度,我看到了 2 个选项。

    第一个是使用Line Drawing Algorithm 来计算线的点并检查鼠标的位置和生成的坐标。如果您选择的线条算法与 .NET 用于绘制线条的算法不同,则此匹配可能会有点“模糊”。

    第二种方法是使用包含您的lineGraphicsPath 并在其上调用.IsVisible(point) 方法,如果路径包含该点,它将返回true

    我推荐选项 2,因为它可能更容易实现,并且允许您使用比实际线更粗的“虚拟路径”,让您的用户更容易与之交互。

    【讨论】:

    • 所以我按照你建议的方式制作了一个函数。我有多种形状,并且我拥有大多数功能,但是检测线时出现问题。这对多边形很有效,但我仍然无法检测到在线上的鼠标
    • 好的,我在“重复”线程中找到了答案。谢谢你:)
    猜你喜欢
    • 2010-12-26
    • 2011-10-08
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多