我正在创建一个图形编辑器。我能够绘制线条和矩形,但现在我想移动它们,所以我现在尝试添加MouseMove事件。我尝试了以下事项:
rectangle.MouseMove += shape_MouseMove;
错误:
' System.Drawing.Rectangle'不包含' MouseDown'的定义没有扩展方法' MouseDown'接受类型' System.Drawing.Rectangle'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
rectangle += shape_MouseMove;
错误:
错误2无法转换方法组' shape_MouseMove'到非委托类型' System.Drawing.Rectangle'。您打算调用方法
吗?错误1运营商' + ='不能应用于类型' System.Drawing.Rectangle'的操作数。和'方法组'
代码:
private void shape_MouseMove(object sender, MouseEventArgs e)
{
}
private void panel_MouseUp(object sender, MouseEventArgs e)
{
draw = false;
xe = e.X;
ye = e.Y;
Item item;
Enum.TryParse<Item>(menuComboBoxShape.ComboBox.SelectedValue.ToString(), out item);
switch (item)
{
case Item.Pencil:
using (Graphics g = panel.CreateGraphics())
using (var pen = new Pen(System.Drawing.Color.Black)) //Create the pen used to draw the line (using statement makes sure the pen is disposed)
{
g.DrawLine(pen, new Point(x, y), new Point(xe, ye));
}
break;
case Item.Rectangle:
Rectangle rectangle = new Rectangle(x, y,xe-x, ye-y);
rectangle += shape_MouseMove; //Error here
using (Graphics g = panel.CreateGraphics())
using (var pen = new Pen(System.Drawing.Color.Black)) //Create the pen used to draw the rectangle (using statement makes sure the pen is disposed)
{
g.DrawRectangle(pen,rectangle);
}
break;
default:
break;
}
}
如何将MouseMove
事件添加到Rectangle
?
答案 0 :(得分:1)
你无法解决问题。
Rectangle
只是一个结构,旨在描述屏幕上的某些区域。为避免手动鼠标/键盘处理问题,您需要将形状包装到UserControl
中,并实现特定于形状的绘画。
这也将使用OOP的好处。您将获得一组形状类型,而不是switch
/ case
,每个类型都将负责绘制其实例:
public partial class RectangularShape : UserControl
{
public RectangularShape()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.FillRectangle(Brushes.Red, ClientRectangle);
}
}
答案 1 :(得分:0)
简单,因为它......你不能
然而,你可以创建一个Control或UserControl的子类,并创建你自己的矩形类型,所有这些花哨的UI支持......
答案 2 :(得分:0)
您应该创建一个类Shape
,其中包含绘制自身所需的所有信息。
然后你应该有List<Shape>
并使用Paint
的{{1}}事件来绘制所有Panel
。
使用Shapes
,无论哪个,都会遇到Winforms GDI +绘图所固有的透明度问题。这意味着重叠控件将无法很好地伪造透明度。控件之间的真正透明度不可能,伪造透明度仅适用于嵌套控件。
Controls
类将包含其类型,位置和大小,颜色和笔式,文本和字体的字段,以及您可能需要了解的各种形状的更多内容。
编辑,更改,删除处理形状列表所需的形状,并在Shape
找到被击中的形状;然后您可以使用MouseDown
进行跟进,或输入其他属性的更改值。
如何做到这一点始终是品味的问题;商业程序有相当不同的方法来解决堆叠冲突:有些人在你的边界附近点击时选择一个形状,其他周期虽然每次点击重叠形状..
您还应该计划改变形状的z顺序的方法..
玩得开心!