Я думаю, что он должен работать, чтобы скопировать исходные данные с поверхности во временную растровую карту перед рисованием прямоугольника, а затем снова нарисовать растровое изображение.
Update
Существует уже принят ответ, но я думал, что я мог бы поделиться пример кода в любом случае. Этот рисунок рисует данный прямоугольник красным цветом для данного элемента управления и восстанавливает область после 500 мс.
public void ShowRectangleBriefly(Control ctl, Rectangle rect)
{
Image toRestore = DrawRectangle(ctl, rect);
ThreadPool.QueueUserWorkItem((WaitCallback)delegate
{
Thread.Sleep(500);
this.Invoke(new Action<Control, Rectangle, Image>(RestoreBackground), ctl, rect, toRestore);
});
}
private void RestoreBackground(Control ctl, Rectangle rect, Image image)
{
using (Graphics g = ctl.CreateGraphics())
{
g.DrawImage(image, rect.Top, rect.Left, image.Width, image.Height);
}
image.Dispose();
}
private Image DrawRectangle(Control ctl, Rectangle rect)
{
Bitmap tempBmp = new Bitmap(rect.Width + 1, rect.Height + 1);
using (Graphics g = Graphics.FromImage(tempBmp))
{
g.CopyFromScreen(ctl.PointToScreen(new Point(rect.Top, rect.Left)), new Point(0, 0), tempBmp.Size);
}
using (Graphics g = this.CreateGraphics())
{
g.DrawRectangle(Pens.Red, rect);
}
return tempBmp;
}
Следует иметь в виду, что в этом случае панель перекрытия будет перехватывать щелчки мыши, поэтому вы должны переслать все соответствующие события в базовую панель. –