2009-10-22 12 views
6

Tak, jestem dość obeznany z tworzeniem formularzy okien.Jak wyczyścić grafikę na przezroczystym sterowaniu w formularzach okienkowych

Próbuję utworzyć komponent "hej jestem zajęty robieniem rzeczy", który po prostu kręci się wokół. Chcę, aby ta kontrola była przejściowa i opierała się na jakichkolwiek innych kontrolach. Klasa dziedziczy bezpośrednio od kontroli.

Więc mam to w konstruktorze:

SetStyle(ControlStyles.Opaque, true); 

i tak:

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

które dostaje mi kontrolę, która będzie się opierała na wierzchu innych kontroli.

Teraz mój problem jest taki. Odświeżam kontrolkę kilka razy na sekundę, aby nadać wrażenie gładkiej animacji. Jednak nie mogę wymyślić, jak wyczyścić to, co zostało narysowane w poprzedniej ramce. Korzystanie z e.Graphics.Clear(Color.Transparent) w OnPaint zmienia kolor całej kontrolki na czarny.

Czy istnieje sposób, aby po prostu wyczyścić zawartość kontrolki?

Zauważyłem, że zmiana rozmiaru kontrolki usunie tło.

Rzeczy, które nie działają

  1. nadrzędnym OnPaintBackground nic nie robić. Lub po prostu wywołanie base.OnPaintBackground. Takie same wyniki.

Odpowiedz

4

Dobra, znalazłem rozwiązanie tutaj: http://www.bobpowell.net/transcontrols.htm

kontroluje dominująca rzeczywiście musi być unieważniony w celu zachowania przezroczyste tło.

+1

Nie trzeba unieważniać całego elementu nadrzędnego, ale tylko obszar odpowiadający formantowi użytkownika: this.Parent.Invalidate (this.ClientRectangle, true); –

+0

@Eric: Dzięki za cynk. Myślę, że mogłem to zrobić! – snicker

+1

To nie będzie działać poprawnie, chyba że kontrola użytkownika znajduje się w lokalizacji (0,0). Musisz unieważnić obszar nadrzędny objęty kontrolą użytkownika i użyć współrzędnych nadrzędnych. Ponadto, jeśli kontrolka użytkownika miałaby przezroczysty obszar poza obszarem klienta, obszar ten również nie zostałby unieważniony. Wybrałbym 'this.Parent.Invalidate (new Rectangle (this.Location, thisSize), true);' – takrl

2

Być może trzeba będzie zastąpić OnPaintBackground tym artykule przedstawia: http://saftsack.fs.uni-bayreuth.de/~dun3/archives/creating-a-transparent-panel-in-net/108.html

Być może trzeba do unieważnienia kontrolę, kiedy to musi być usunięte, aby wymusić OnPaintBackground nazywać.

+0

To nie rozwiązuje problemu. I wcześniej unieważniłem kontrolę. W każdym razie dzięki. – snicker

+0

Ale znalazłem link do prawdziwego rozwiązania w komentarzach na tej stronie, więc +1 i dziękuję. – snicker

+0

Nie każda operacja może przesłonić postpbackbackground, np. Etykietkę narzędzi – Mike

Powiązane problemy