2009-06-11 2 views
5

Я рисую прямоугольник, спящий на несколько миллисекунд - тогда я хочу очистить прямоугольник, но я не могу понять, как это сделать. (Прямоугольник сидит над графикой, так что я не могу просто покрыть его с другим прямоугольником)Очистка DrawRectangle в Windows Forms

   graphics.DrawRectangle(p, innerRectangle) 
       System.Threading.Thread.Sleep(75) 
       Next I want to clear the rectange... 

ответ

5

Вам нужно перерисовать графику (или по крайней мере часть его под прямоугольником). Если это окно с картинкой или что-то подобное, используйте Invaldiate(), чтобы заставить перекрасить.

2

Я думаю, что он должен работать, чтобы скопировать исходные данные с поверхности во временную растровую карту перед рисованием прямоугольника, а затем снова нарисовать растровое изображение.

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; 
} 
2

Если прямоугольник полностью расположен над графикой, вы должны просто перерисовать или обновить основной рисунок. Если это не так, вам нужно будет перерисовать прямоугольник, используя цвет фона, а затем обновить основной рисунок.

1

У меня была такая же проблема, и я разрешил ее с дополнительной панелью, нарисованной на основной форме и показанной/скрытой, размерной и позиционируемой по мере необходимости.

SelectionBox box = new SelectionBox(); 
box.Location = location; 
box.Size = size; 
box.Visible = true; 

Затем, когда прямоугольник не нужно больше, просто скрыть его по телефону:

класс
box.Visible = false; 

Панель выполнена с прозрачностью, чтобы гарантировать, что наложения графики не скрывает другого содержимого окна.

[System.ComponentModel.DesignerCategory("Code")] 
    public class SelectionBox : Panel 
    { 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     const int penWidth = 2; 
     int offset = penWidth - 1; 
     using (Pen pen = new Pen(Color.Red, 2)) 
     e.Graphics.DrawRectangle(pen, offset, offset, 
      ClientSize.Width - offset - 1, ClientSize.Height - offset - 1); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT 
     return cp; 
     } 
    } 
    } 
+0

Следует иметь в виду, что в этом случае панель перекрытия будет перехватывать щелчки мыши, поэтому вы должны переслать все соответствующие события в базовую панель. –