图形。在Windows窗体控件上清除也会清除控件本身-如何防止这种情况?
题
我尝试在Picturebox上绘制自定义选择矩形,使用下面的方法:
void _drag_UpdateView(bool clearOnly, MouseEventArgs e)
{
System.Diagnostics.Debug.WriteLine("UpdateView");
using (Graphics g = this.i_rendered.CreateGraphics())
{
g.Clear(Color.Transparent);
if (clearOnly)
return;
int px = (_drag_start.X > e.Location.X)?e.Location.X:_drag_start.X;
int py = (_drag_start.Y > e.Location.Y)?e.Location.Y:_drag_start.Y;
if (px < 0)
px = 0;
if (py < 0)
py = 0;
int wx = Math.Abs(e.Location.X-_drag_start.X);
int wy = Math.Abs(e.Location.Y-_drag_start.Y);
g.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
}
每当我打电话:
g.Clear(Color.Transparent);
整个picturebox变成黑色。但是,矩形被绘制在它上面。如果我不调用该方法,当然,矩形会自行堆叠。我想删除旧的矩形并像这样创建一个新的矩形。
任何人都可以描述什么是错的?
解决方案
不要在任何其他方法中绘制您的控件,而不是 OnPaintBackground
或 OnPaint
.
实际上,出于性能原因,你可能需要它(你不会刷新完全控制,只是改变一些动态的东西),但它会使你的代码更加棘手,你总是需要在 Paint
事件也是如此(因为它可能由于许多其他原因被调用,所以输出应该是相同的)。
在 Paint
你甚至不需要使用 CreateGraphics
, ,图形上下文在 PaintEventArgs
对象,因此将代码更改为:
void DoPainting(object sender, PaintEventArgs e)
{
// Do your calculations
e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}
正如@AndersForsgren所指出的使用 CreateGraphics
方法并不常见,通常您不需要调用它(例如,您需要根据图形执行一些计算,例如AutoSize)。
不隶属于 StackOverflow