我用如下语句画了一条带箭头的直线,现在的问题是我如何判断Mouse位于该条直线及其箭头线帽内.
graphics.SmoothingMode = SmoothingMode.AntiAlias;
AdjustableArrowCap lineCap = new AdjustableArrowCap(3.0F, 3.0F, true);
Pen pen = new Pen(Selected ? skin.SelectedColor : skin.ForeColor, skin.LineWidth);
pen.CustomEndCap = lineCap;
graphics.DrawLine(pen, FromPoint, ToPoint);比如说如果画的是矩形,那很简单就判断,如下:public bool Contains(Point point)
{
return new Rectangle(Location, Size).Contains(point);
}我现在想达到的效果就是像矩形一样判断该点是否在该条直线及其箭头线帽内.
我曾尝试过用以下方法来判断 public bool Contains(Point point)
{
GraphicsPath path = new GraphicsPath();
path.AddLine(FromPoint, ToPoint);
path.CloseFigure();
foreach (PointF floatPoint in path.PathPoints)
{
Point intPoint = new Point((int)floatPoint.X, (int)floatPoint.Y);
if (intPoint == point)
{
return true;
}
}
return false;
}但是没有达到效果,因为path.PathPoints只包含2个点,即使这样的办法行得通,也无法判断箭头
graphics.SmoothingMode = SmoothingMode.AntiAlias;
AdjustableArrowCap lineCap = new AdjustableArrowCap(3.0F, 3.0F, true);
Pen pen = new Pen(Selected ? skin.SelectedColor : skin.ForeColor, skin.LineWidth);
pen.CustomEndCap = lineCap;
graphics.DrawLine(pen, FromPoint, ToPoint);比如说如果画的是矩形,那很简单就判断,如下:public bool Contains(Point point)
{
return new Rectangle(Location, Size).Contains(point);
}我现在想达到的效果就是像矩形一样判断该点是否在该条直线及其箭头线帽内.
我曾尝试过用以下方法来判断 public bool Contains(Point point)
{
GraphicsPath path = new GraphicsPath();
path.AddLine(FromPoint, ToPoint);
path.CloseFigure();
foreach (PointF floatPoint in path.PathPoints)
{
Point intPoint = new Point((int)floatPoint.X, (int)floatPoint.Y);
if (intPoint == point)
{
return true;
}
}
return false;
}但是没有达到效果,因为path.PathPoints只包含2个点,即使这样的办法行得通,也无法判断箭头
GraphicsPath path = new GraphicsPath();
path.AddLine(FromPoint, ToPoint);
path.CloseFigure(); Region r = new Region(path);
return r.IsVisible(point);
不知道有没有相关的Api来解决这个问题
public bool Contains(Point point, Skin skin)
{
GraphicsPath path = new GraphicsPath();
path.AddLine(FromPoint, ToPoint);
path.CloseFigure();
AdjustableArrowCap lineCap = new AdjustableArrowCap(3.0F, 3.0F, true);
Pen pen = new Pen(Selected ? skin.SelectedColor : skin.ForeColor, skin.LineWidth);
pen.CustomEndCap = lineCap;
return path.IsOutlineVisible(point, pen);
}