Windows 窗体控件上的 Graphics.Clear 也会清除控件本身 - 如何防止这种情况
本文关键字:控件 何防止 情况 窗体 Graphics Clear Windows 清除 | 更新日期: 2023-09-27 18:34:53
我尝试使用以下方法在图片框上绘制自定义选择矩形:
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);
整个图片框变黑。但是,矩形会在其上绘制。当然,如果我不调用该方法,矩形会自行堆叠。我想删除旧矩形并创建一个这样的新矩形。
谁能描述出了什么问题?
不要在除 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(。