如何用鼠标移动矩形

时间:2014-02-18 09:49:04

标签: c# winforms

我想在屏幕上移动一个矩形。 这是我同时做的代码:

internal class GraphicContainer : Control
{
    //---------------------METHODS---------------------
    public GraphicContainer(Control control, string text, int left, int top)
        : base(control, text, left, top, 400, 200)

    protected override void OnPaint(PaintEventArgs pe)
    {
        // Call the OnPaint method of the base class.
        base.OnPaint(pe);

        // Declare and instantiate a new pen.
        Pen pen = new Pen(Color.Fuchsia, 15);
        SolidBrush myBrush= new System.Drawing.SolidBrush(Color.HotPink);
        // Draw an aqua rectangle in the rectangle represented by the control.
        //pe.Graphics.DrawRectangle(pen, new Rectangle(this.Location,this.Size));
        Rectangle blublublu = new Rectangle(this.Location, this.Size - new Size(25, 25));
        pe.Graphics.DrawRectangle(pen,blublublu);
        pe.Graphics.FillRectangle(myBrush,blublublu);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {        
    }

    protected override void OnClick(EventArgs e)
    {
    }
}

我搜索了很多,并没有找到我应该写的代码" OnMouseMove"和" OnClick"为了让鼠标移动。

2 个答案:

答案 0 :(得分:0)

瑞安雷诺兹!

让blublublu成为一个领域。 您必须使用MouseMoveMouseUpMouseDown

    Rectangle blublublu = new Rectangle(...); // possibly init in constructor

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Capture = true;
            _x = e.X; // remember coords
            _y = e.Y;
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        Capture = false;
        base.OnMouseUp(e);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            blublublu.X += _x - e.X; // not tested, maybe use Rectangle.Offset or create a new Rectangle
            blublublu.Y += _y - e.Y;
            Invalidate();
        }
    }

当鼠标停止时,你捕获它(即使鼠标移动到控制之外也接收鼠标移动事件)并记住坐标。在鼠标移动过程中,您可以通过差异(保存鼠标位置减去当前值)更改blublublu的当前坐标并调用Invalidate

答案 1 :(得分:0)

您可以制作Location变量并使鼠标移动控件无效。此外,只有在按下鼠标左键时才会发生这种情况

请注意,我不会覆盖OnMouseMove,而是通过添加其他处理程序来订阅该事件。

Point mouseLocation;

public GraphicContainer(Control control, string text, int left, int top)
    : base(control, text, left, top, 400, 200) {
    //prevents flickering
    this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);

    //subscribes to mousemove
    this.MouseMove += (obj,e) => {
        //only when left mousebutton is pressed
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            //update the location
            mouseLocation = e.Location;
            //invalidate the control
            this.Invalidate();
        }
    };
}

protected override void OnPaint(PaintEventArgs pe)
{
    // Call the OnPaint method of the base class.
    base.OnPaint(pe);

    // Declare and instantiate a new pen.
    Pen pen = new Pen(Color.Fuchsia, 15);
    SolidBrush myBrush = new System.Drawing.SolidBrush(Color.HotPink);
    // Draw an aqua rectangle in the rectangle represented by the control.
    Rectangle blublublu = new Rectangle(mouseLocation, this.Size - new Size(25, 25));
        pe.Graphics.DrawRectangle(pen, blublublu);
    pe.Graphics.FillRectangle(myBrush, blublublu);
}

protected override void OnMouseMove(MouseEventArgs e)
{
    //nothing here
}

请注意,我在构造函数中添加了this.SetStyle(...),因为这样可以防止移动矩形时出现闪烁。我还在this.Location方法中将mouseLocation更改为OnPaint

相关问题