C# 使用鼠标在面板中绘制矩形

C# 使用鼠标在面板中绘制矩形,c#,winforms,C#,Winforms,所以我最近一直在尝试做一个油漆应用来练习C。 我过去两天的问题是创建矩形 我做了一个面板,所以所有的图纸都在那里。用户使用菜单选择要绘制的形状,然后可以使用鼠标开始绘制 我遇到以下两个问题: 1) 尽管我的起点在面板内部,但我移动鼠标,走出面板,在面板外部绘制矩形,如下图所示 2) 创建此矩形并尝试绘制另一个矩形后,上一个矩形将被删除。所以在某种程度上我不能同时画两个矩形 这是我源代码的一部分 Graphics mygraphics; Pen lPen = new Pen(Color.Blac

所以我最近一直在尝试做一个油漆应用来练习C。 我过去两天的问题是创建矩形

我做了一个面板,所以所有的图纸都在那里。用户使用菜单选择要绘制的形状,然后可以使用鼠标开始绘制

我遇到以下两个问题:
1) 尽管我的起点在面板内部,但我移动鼠标,走出面板,在面板外部绘制矩形,如下图所示

2) 创建此矩形并尝试绘制另一个矩形后,上一个矩形将被删除。所以在某种程度上我不能同时画两个矩形

这是我源代码的一部分

Graphics mygraphics;
Pen lPen = new Pen(Color.Black); //Left Pen
Pen rPen = new Pen(Color.White); //Right pen
Point sp = new Point(0, 0);
private bool isRectangle; 
private bool isLeft, isRight; //isLeft -- Left Click, isRight -- Right Click

private void drawPanel_MouseMove(object sender, MouseEventArgs e)
{
   if (isRectangle == true)
   {
       if (e.Button == MouseButtons.Left)
       {
         isLeft = true;
         Point p = e.Location;
         int x = Math.Min(sp.X, p.X);
         int y = Math.Min(sp.Y, p.Y);
         int w = Math.Abs(p.X - sp.X);
         int h = Math.Abs(p.Y - sp.Y);
         mRect = new Rectangle(x, y, w, h);
         this.Invalidate();
       }
   }
}

private void drawPanel_MouseDown(object sender, MouseEventArgs e)
{
    sp = e.Location;           
}

private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
    isLeft = false;
}

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    e.Graphics.DrawRectangle(lPen, mRect);
}
我想完成的是,在我尝试绘制另一个矩形并在面板中绘制它们之后,我的矩形不会被删除


你们有什么建议吗?

以下是我建议的最小改动:

List<Rectangle> rectangles = new List<Rectangle>();
Rectangle mRect = Rectangle.Empty;


private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
   isLeft = false;
   rectangles.Add(mRect);
   mRect = Rectangle.Empty;
   drawPanel.Invalidate();
}

private void drawPanel_Paint(object sender, PaintEventArgs e)
{
   foreach (Rectangle rect in rectangles) e.Graphics.DrawRectangle(lPen, rect );
   e.Graphics.DrawRectangle(Pens.Orange, mRect);  // or whatever..
}
List矩形=新列表();
矩形mRect=矩形。空;
私有void drawPanel_MouseUp(对象发送器,MouseEventArgs e)
{
isLeft=false;
矩形。添加(mRect);
mRect=矩形。为空;
drawPanel.Invalidate();
}
私有void drawPanel_Paint(对象发送器、PaintEventArgs e)
{
foreach(矩形中的矩形)e.Graphics.DrawRectangle(lPen,rect);
e、 Graphics.DrawRectangle(Pens.Orange,mRect);//或其他。。
}
请注意,
绘制
事件现在是
面板
中的一个事件。请务必使用
面板


还要注意我是如何用不同于其他矩形列表的颜色绘制当前矩形的;这当然是可选的。

将矩形保存在某种数组中,并操作绘图方法从数组中绘制所有矩形。您的
绘制
事件是
窗体的
而不是
面板的绘制
事件。并将所有的
矩形
保存在
列表中
或者(更好的)保存在
列表中
中,该列表包含钢笔和颜色等。。还有你可能想学习的帖子。有很多关于堆栈溢出的问答已经在讨论与基于用户鼠标移动绘制矩形(和其他形状)相关的新手问题,包括标记的副本,其中有足够的讨论来解决你主要关心的保留绘制的图形。您可以搜索其他问题,解决溢出失控;简短的版本:由你来绘制你想要的矩形…如果你不想矩形的右下角超出控制范围,不要指定超出控制范围的坐标。正如我通常同意你的观点,这次我只需注意链接没有解决OP的任何问题。他们都得到了无数次的回答,但肯定没有。你的最后一句话也很离谱,看看代码和图片;-)我一整天都在寻找解决办法,最后我开始失望了。你的回答确实涵盖了一切。我很佩服你,非常感谢!:)如果我想改变我笔的颜色,但不改变我所做的所有其他矩形的颜色,我该怎么办?是否有一种方法可以为每个矩形添加颜色设置?是的,但您需要将列表更改为更复杂的内容。创建一个自己的类,该类包含一个矩形属性和一种颜色,或者一支笔,然后将
List
更改为List。然后可以存储绘制每个矩形所需的所有内容。以它自己的方式。添加颜色选择器,可能是线宽选择器,也可能是虚线样式选择器。。玩得高兴一定要看看我在评论中链接到的帖子!