我正在尝试创建一个 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);
}
我应该如何做这项工作?
答案 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个线点(线)进行测试