在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);
}
任何想法都会非常感激。
答案 0 :(得分:3)
那是因为你没有在窗户上画画,你只是画在窗户恰好是的屏幕上。
您需要使用Paint
事件进行绘图。您需要以某种方式存储绘制的内容,或者作为命令列表以便重复它们,或者作为位图图像。
因此,当您想要绘制某些内容时,将其添加到命令列表中或在位图上绘制它,然后使控件无效以便调用Paint
事件。在Paint
甚至你添加代码来进行实际绘图,即重复列表中的命令,或者将位图绘制到控件上。
答案 1 :(得分:1)
您需要将所有绘图代码移动到Paint事件处理程序。在鼠标事件处理程序中,只需设置一些反映新图像状态的变量,并使窗口无效。请看一下这个示例:http://www.codeproject.com/KB/graphics/drawtools.aspx
答案 2 :(得分:1)
我认为你所面对的是你的画面痘被重新粉刷它的油漆事件。
我通常用来管理自定义绘画作业的方法是:
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功能保存图像。 您需要在调整大小时调整位图大小。