c# - 如何在 MouseDown/Move c# 上绘制矩形

标签 c# drawing draw

当我在左键单击鼠标的同时向下拖动鼠标时,我不太确定如何绘制矩形(未填充)。

目前我有这个

            private void canevas_MouseDown( object sender , MouseEventArgs e )
            {
                    if( e.Button == MouseButtons.Left )
                    {
                            _topLeft = new Point( e.X , e.Y );
                            _drawing = true;
                    }
            }

            private void canevas_MouseMove( object sender , MouseEventArgs e )
            {
                    if( _drawing )
                    {
                            Rectangle rec = new Rectangle( _topLeft.X , _topLeft.Y , ( e.X - _topLeft.X ) , ( e.Y - _topLeft.Y ) );
                            canevas.CreateGraphics().DrawRectangle( Pens.Black , rec );
                    }
            }

但问题是我不想让所有的矩形都出现

最佳答案

一些与 Ed 的正确答案相匹配的代码:

    Point startPos;      // mouse-down position
    Point currentPos;    // current mouse position
    bool drawing;        // busy drawing
    List<Rectangle> rectangles = new List<Rectangle>();  // previous rectangles

    private Rectangle getRectangle() {
        return new Rectangle(
            Math.Min(startPos.X, currentPos.X),
            Math.Min(startPos.Y, currentPos.Y),
            Math.Abs(startPos.X - currentPos.X),
            Math.Abs(startPos.Y - currentPos.Y));
    }

    private void canevas_MouseDown(object sender, MouseEventArgs e) {
        currentPos = startPos = e.Location;
        drawing = true;
    }

    private void canevas_MouseMove(object sender, MouseEventArgs e) {
        currentPos = e.Location;
        if (drawing) canevas.Invalidate();
    }

    private void canevas_MouseUp(object sender, MouseEventArgs e) {
        if (drawing) {
            drawing = false;
            var rc = getRectangle();
            if (rc.Width > 0 && rc.Height > 0) rectangles.Add(rc);
            canevas.Invalidate();
        }
    }

    private void canevas_Paint(object sender, PaintEventArgs e) {
        if (rectangles.Count > 0) e.Graphics.DrawRectangles(Pens.Black, rectangles.ToArray());
        if (drawing) e.Graphics.DrawRectangle(Pens.Red, getRectangle());
    }

要获得打开双缓冲的“canevas”,使其绘画不会闪烁,请使用“项目”+“添加新项目”,选择“类”并粘贴此代码:

using System;
using System.Windows.Forms;

class Canvas : Panel {
    public Canvas() {
        this.DoubleBuffered = true;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
    }
}

编译。将新控件从工具箱顶部拖到您的窗体上,替换原来的“canevas”。相应地更新事件处理程序。

关于c# - 如何在 MouseDown/Move c# 上绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060446/

相关文章:

opengl - glDrawElements - "consume"索引如何?

c# - 旋转至面向光标的箭头仅需要在两个给定方向形成的角度内时执行此操作

ios - 从 UIBezierPath 中移除点

ios - 是否可以用 SpriteKit 动画画一条线?

java - 在 JPanel 中绘制一组对象

javascript - 在 html 页面中的 2 个元素之间画线

c# - 如何使用 C# 获取电池健康状况

c# - C#中的并行数组处理

c# - 内存库模式和单元测试

algorithm - 绘制用户定义的树