Rectangle添加MouseMove事件

时间:2015-05-13 08:25:10

标签: c# winforms

我正在创建一个图形编辑器。我能够绘制线条和矩形,但现在我想移动它们,所以我现在尝试添加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

3 个答案:

答案 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顺序的方法..

玩得开心!