繁体   English   中英

用鼠标绘制矩形

[英]Draw rectangle with mouse

有没有办法用起点和终点而不是起点和面积来绘制矩形? 我正在使用以下代码,通过鼠标在窗体上绘制矩形:

    System.Drawing.Graphics formGraphics;
    bool isDown = false;
    int initialX;
    int initialY;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        isDown = true;
        initialX = e.X;
        initialY = e.Y;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDown == true)
        {
            this.Refresh();
            Pen drwaPen = new Pen(Color.Navy,1);
            int width = e.X - initialX, height = e.Y - initialY;
            //if (Math.Sign (width) == -1) width = width 
            //Rectangle rect = new Rectangle(initialPt.X, initialPt.Y, Cursor.Position.X - initialPt.X, Cursor.Position.Y - initialPt.Y);
            Rectangle rect = new Rectangle(initialX, initialY, width * Math.Sign(width), height * Math.Sign(height));

            formGraphics = this.CreateGraphics();
            formGraphics.DrawRectangle(drwaPen, rect);
        }
    }
    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        isDown = false;
    }

我可以使用此代码绘制矩形,当我将鼠标从其起点移回该矩形时,该矩形应翻转,但我没有继续这样做,而是继续沿与鼠标光标相反的方向绘制矩形。 简而言之,此代码在向前绘制矩形时效果很好,但向后绘制则无效。

正如Jamiec所述,只需在MouseMove处理程序中调用Invalidate ,然后在OnPaint方法/ Paint事件处理程序中进行Paint

要向前或向后绘制正确的矩形,请尝试以下操作:

Rectangle rect = new Rectangle(Math.Min(e.X, initialX), 
                               Math.Min(e.Y, initialY), 
                               Math.Abs(e.X - initialX), 
                               Math.Abs(e.Y - initialY));

尝试这个:

private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        IsMouseDown = true; // If This Event Is Occured So This Variable Is True.

        LocationXY = e.Location; // Get The Starting Location Of Point X and Y.
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
        {
            LocationX1Y1 = e.Location; // Get The Current Location Of Point X and Y.

            Refresh(); // Refresh the form.
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        if(IsMouseDown == true) // This Block Is Not Execute Until Mouse Down Event Is Not a Fire.
        {
            LocationX1Y1 = e.Location; // Get The Ending Point of X and Y.

            IsMouseDown = false; // false this..
        }
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        if (rect != null) // Check If Rectangle Is Not a null.
        {
            e.Graphics.DrawRectangle(Pens.Red, GetRect()); // GetRect() Is a Function, Now Creates this function.
        }
    }

    private Rectangle GetRect()
    {
    //Create Object Of rect. we define rect at TOP.
        rect = new Rectangle();

    //The x-value of our Rectangle should be the minimum between the start x-value and the current x-position.
        rect.X = Math.Min(LocationXY.X, LocationX1Y1.X);

    //same as above x-value. The y-value of our Rectangle should be the minimum between the start y-value and the current y-position.
        rect.Y = Math.Min(LocationXY.Y, LocationX1Y1.Y);

     //the width of our rectangle should be the maximum between the start x-position and current x-position MINUS.
        rect.Width = Math.Abs(LocationXY.X - LocationX1Y1.X); 

        rect.Height = Math.Abs(LocationXY.Y - LocationX1Y1.Y);

        return rect;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM