如何在c#中使用鼠标在面板中选择圆形或矩形等绘制的形状

时间:2017-10-30 14:08:35

标签: c# winforms mouseevent draw shape

我正在尝试创建一个 minipaint 应用程序,它有三个按钮(矩形,圆形和直线)。我在使用鼠标选择和移动形状时遇到问题。例如,我有这个矩形类,它从形状继承颜色,厚度:

abstract class Drawable
{
  public int x { get; set; }
  public int y { get; set; }
  public abstract void draw(Graphics g);
 }

 private void panel1_MouseDown(object sender, MouseEventArgs e)
 {
    foreach (Drawable o in lstShapsOnForm)
    {
       if (e.Location.X >= o.x || e.Location.X < o.x)
        propertyGrid1.SelectedObject = o;       
    }
 }

现在,每当我点击矩形的任何部分时,我希望我的panel1_MouseDown在我的面板中选择一个矩形。 所有绘制的形状都添加到名为lstShapsOnForm的列表中,drawable是一个抽象类,它具有抽象的绘制方法和属性x y。

   if (!ModelState.IsValid)
        {
            var message = string.Join(" | ", ModelState.Values
                .SelectMany(v => v.Errors)
                .Select(e => e.ErrorMessage));
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message);
        }

我应该如何做这项工作?

1 个答案:

答案 0 :(得分:0)

最简单的事情是让形状的责任知道它们是否已被点击,因此添加一个IsInside方法,例如:

abstract class Drawable
{
  public int x { get; set; }
  public int y { get; set; }
  public abstract void draw(Graphics g);
  public abstract bool IsInside(int x, int y);
}

然后测试:

var shapeHit = lstShapsOnForm.FirstOrDefault(s => s.IsInside(e.Location.X, e.Location.Y));    
if (shapeHit != null)
  propertyGrid1.SelectedObject = shapeHit;   

对于矩形,假设您知道宽度和高度(如果您绘制它,则应该如此),并假设x和y属性是左上角,那么它将是这样的:

public override bool IsInside(int mouseX, int mouseY) 
{
    return 
        mouseX >= x && 
        mouseX <= x + width &&
        mouseY >= y &&
        mouseY <= y + height;
}

对于圆圈和直线.....我建议你google&#39;如何确定x / y点是否在圈内/在线&#39;。它将涉及使用半径(圆圈)和2个线点(线)进行测试