【问题标题】:Hit-Testing Windows Form graphics命中测试 Windows 窗体图形
【发布时间】:2014-05-03 10:41:05
【问题描述】:

我需要为我的 Windows 窗体控件实现命中测试。我有我的自定义类,它继承了 Control 类,我在 OnPaint 方法中绘制了一条折线:

e.Graphics.DrawLines(myPen, myPoints);

现在,在MouseDown 事件期间,我获得了鼠标的位置,并实现了如下的命中测试:

using (var path = new GraphicsPath())
{  
   path.AddLines(myPoints);
   return path.IsVisible(pt);
}

问题是,如果有,例如,图中的折线(可能看起来像一个多边形)IsVisible 方法返回 true,即使我在代表这个多边形的区域内单击:

我需要不同的行为,只有当我点击该行时,该方法才必须返回 true。 我该怎么办?

【问题讨论】:

  • 一个更好的解决方案是创建一个对象/一个 model 来代表你想要的形式,它会自己绘制。然后对象将负责检查它是否被击中(在哪个区域)而不是主程序。在主应用程序中,您只需为要检查的每个对象传递鼠标坐标。
  • @pasty 谢谢你的建议,实际上我正在按照你说的做。这个问题只是一个更简单的例子。
  • @Nick 正如我在answer 中发布的那样,您只需将IsVisible 替换为IsOutlineVisible

标签: c# winforms graphics gdi+ hittest


【解决方案1】:

您只需要使用不同的方法进行命中测试:IsOutlineVisible 而不是 IsVisible

using (var path = new GraphicsPath())
{  
   path.AddLines(myPoints);
   return path.IsOutlineVisible(pt, Pens.Black);
}

您需要提供一支笔,因为基于线条的命中测试适用于线条,并且线条可以具有特定的宽度。也就是说,我建议使用与绘图不同的(较粗的)笔,因为对于许多用户来说,用鼠标选择单个像素并不容易。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2016-04-17
    • 2019-02-16
    相关资源
    最近更新 更多