2009-10-22 4 views
6

Итак, я довольно незнакома с разработкой форм Windows.Как очистить графику от прозрачного элемента управления в формах окон

Я пытаюсь создать компонент «эй, я занят занятием», который просто вращает вокруг фигуру. Я хочу, чтобы этот элемент управления был временным и выполнялся поверх любых других элементов управления. Класс наследуется непосредственно из Control.

Так я это в конструкторе:

SetStyle(ControlStyles.Opaque, true); 

и это:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     CreateParams parms = base.CreateParams; 
     parms.ExStyle |= 0x20; 
     return parms; 
    } 
} 

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

Теперь моя проблема в этом. Я перерисовываю элемент управления несколько раз в секунду, чтобы создать гладкую анимацию. Однако я не могу понять, как очистить то, что было нарисовано в предыдущем кадре. Использование e.Graphics.Clear(Color.Transparent) в OnPaint превращает весь черный контроль.

Есть ли способ очистить нарисованное содержимое элемента управления?

Я заметил, что изменение размера элемента управления очистит фон.

вещи, которые не работают

  1. Переопределение OnPaintBackground ничего не делать. Или просто назовите base.OnPaintBackground. Те же результаты.

ответ

4

Хорошо, я нашел решение здесь: http://www.bobpowell.net/transcontrols.htm

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

+1

Вам не нужно отменять весь родительский элемент управления, но только область, соответствующая пользовательскому элементу управления: this.Parent.Invalidate (this.ClientRectangle, true); –

+0

@ Эрик: Спасибо за подсказку. Думаю, я, возможно, так и сделал! – snicker

+1

Это не будет работать должным образом, если пользовательский контроль не находится в месте (0,0). Вы должны аннулировать родительскую область, охватываемую usercontrol, и использовать родительские координаты. Кроме того, если usercontrol имеет прозрачную неклиентскую область, эта область также не будет признана недействительной. Я бы пошел на 'this.Parent.Invalidate (новый Rectangle (this.Location, this.Size), true);' – takrl

2

Вы, возможно, придется переопределить OnPaintBackground, что эта статья представляет: http://saftsack.fs.uni-bayreuth.de/~dun3/archives/creating-a-transparent-panel-in-net/108.html

Вам также может понадобиться, чтобы Аннулируйте контроль, когда он должен быть очищен, чтобы заставить OnPaintBackground называться.

+0

Это не исправить проблему. И раньше я был недействительным. Спасибо хоть. – snicker

+0

Но я нашел ссылку для реального решения в комментариях этой страницы, так что +1 и спасибо. – snicker

+0

Не каждый элемент управления может переопределять onpaintbackground, например tooltip – Mike