C#图形被覆盖

时间:2010-08-18 16:40:22

标签: c# winforms graphics picturebox

在c#中我在win表单上使用PictureBox。

我正在尝试重新创建MSPaint以了解图形对象。除了当PictureBox顶部的另一个窗口打开,或者整个窗体调整大小时,它被删除后,其他窗口下绘制的内容都可以正常工作。

这是我正在使用的代码的缩小版本。

private Graphics _g;
private bool _bIsMouseDown = false;

private void picCanvas_MouseDown(object sender, MouseEventArgs e)
{
  if (!_bIsGraphicsSet) _g = picCanvas.CreateGraphics();
  _bIsMouseDown = true;
  DrawRectangle(e);
}

private void picCanvas_MouseMove(object sender, MouseEventArgs e)
{
  if (_bIsMouseDown) DrawRectangle(e);
}

private void picCanvas_MouseUp(object sender, MouseEventArgs e)
{
  _bIsMouseDown = false;
}

private void DrawRectangle(MouseEventArgs e)
{
    System.Drawing.Rectangle r = CreateRectangle(e);
    Pen pen = ChooseDrawColor();
    _g.DrawRectangle(pen, r);
}

private Rectangle CreateRectangle(MouseEventArgs e)
{
  int h = 10; 
  int w = 10; 
// there is code in here for multiple sized rectangles, 
//I know the math can be simplified for this example. 
          return new Rectangle(e.X - (w / 2), e.Y - (h / 2), w, h);
        }

任何想法都会非常感激。

4 个答案:

答案 0 :(得分:3)

那是因为你没有在窗户上画画,你只是画在窗户恰好是的屏幕上。

您需要使用Paint事件进行绘图。您需要以某种方式存储绘制的内容,或者作为命令列表以便重复它们,或者作为位图图像。

因此,当您想要绘制某些内容时,将其添加到命令列表中或在位图上绘制它,然后使控件无效以便调用Paint事件。在Paint甚至你添加代码来进行实际绘图,即重复列表中的命令,或者将位图绘制到控件上。

答案 1 :(得分:1)

您需要将所有绘图代码移动到Paint事件处理程序。在鼠标事件处理程序中,只需设置一些反映新图像状态的变量,并使窗口无效。请看一下这个示例:http://www.codeproject.com/KB/graphics/drawtools.aspx

答案 2 :(得分:1)

我认为你所面对的是你的画面痘被重新粉刷它的油漆事件。

我通常用来管理自定义绘画作业的方法是:

  • 将您图片的一些抽象表示存储为类成员。我是你的情况,它可能是形状,位图等的集合。
  • 覆盖OnPaint方法(如果扩展控件)或Paint事件处理程序,并使用上面存储的数据重复绘制步骤。
  • 在应导致更新的事件中,例如picCanvas_MouseDown,请在控件上调用Invalidate()以强制重新显示。

因为调整大小事件会导致失效,所以您的绘图例程将被调用,图片看起来将保持不变。

答案 3 :(得分:0)

您可以创建图像来存储图形。

private Bitmap _drawBuffer;

...

_drawBuffer = new Bitmap(pictureBox.Image);
_g = Graphics.FromImage(_drawBuffer));

...

private void DrawRectangle(MouseEventArgs e)
{
    System.Drawing.Rectangle r = CreateRectangle(e);
    Pen pen = ChooseDrawColor();
    _g.DrawRectangle(pen, r);
    pictureBox.Image = _drawBuffer;
}

这样可以使用Image.Save功能保存图像。 您需要在调整大小时调整位图大小。