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

时间:2015-11-17 21:32:03

标签: c# winforms

所以我最近一直在努力制作一个用于练习C#的绘画应用程序。 我过去2天的问题是创建矩形。

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

我遇到以下两个问题:
1)即使我的起点位于面板内部,我移动鼠标并走到面板外面,矩形被绘制在面板外面,如下图所示。

enter image description here

2)创建此矩形后,我尝试绘制另一个矩形,删除前一个矩形。所以在某种程度上我无法一次绘制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);
}

我想要完成的是在我尝试绘制另一个并在面板中绘制它们之后,我的矩形没有被删除。

你们有什么建议?

1 个答案:

答案 0 :(得分:0)

以下是我建议的最小变化:

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..
}

请注意,Paint事件现在是Panel之一。请确保hook it up使用Panel !!

另请注意我如何以与其他矩形列表不同的颜色绘制当前矩形mRect;这当然是可选的..