2010-08-18 104 views
0

在c#中,我在赢取窗体上使用PictureBox。被覆盖的C#图形

我正在尝试重新创建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); 
     } 

任何想法将不胜感激。

回答

3

那是因为你没有在窗口上绘图,你只是在窗口恰好在屏幕上绘图。

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

因此,当您想要绘制某些东西时,将其添加到您的命令列表或将其绘制在位图上,然后使控件失效,以便调用Paint事件。在Paint中,即使您添加了代码来执行实际绘图,即重复列表中的命令,或者将位图绘制到控件上。

1

我认为你面对的是你的图片痘在绘画事件重绘。

我通常采取的管理自定义油漆工作的做法是这样的:

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

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

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功能保存图像的优势。 您需要调整调整大小的位图。