2008-12-17 7 views
5

Stworzyłem prostą kontrolę użytkownika, który jest ręcznie utworzoną z czymś jakUstawianie rodzica usercontrol uniemożliwia bycie przejrzysty

MyUserControl ctrl = new MyUserControl(); 

Sterowanie zostały zaprojektowane, aby mieć BackColor = Color.Transparent i to działa dobrze, dopóki nie ustawię formantu kontrolki w formularzu, kiedy to zmieni się w kolor formularza.

Może brzmieć jak przezroczysty, ale to, co robi, to ukryć wszystkie kontrolki, które istnieją również w formularzu. Nie jestem w 100% pewien, czy to kontrola, która dostaje stałe tło, czy coś innego, co dzieje się po podłączeniu, co uniemożliwia wyświetlanie innych kontrolek.

Zasadniczo, jeśli można to zrobić

  • Tworzenie formularza
  • Upuść przycisk na nim
  • W obsługi kliknij na przycisku, który ma następujące

Przykład

MyUserControl ctrl = new MyUserControl(); 
ctrl.Parent = this; 
ctrl.BackColor = Color.Transparent; 
ctrl.Size = this.Parent.ClientRectangle.Size; 
ctrl.Location = this.Parent.ClientRectangle.Location; 
ctrl.BringToFront(); 
ctrl.Show(); 

Zasadniczo ja chcesz, aby kontrolka użytkownika nakładała cały formularz, jednocześnie pokazując kontrolki underlayingu w formularzu (stąd przezroczyste tło). Nie chcę dodawać go do kolekcji kontrolek formularzy, ponieważ tak naprawdę nie należy do formularza, jest po prostu pokazany na szczycie wszystkiego, co jeszcze jest,

Próbowałem zrobić to samo, ale bez ustawienia rodzica, ale potem kontrola wcale się nie pojawiła.

Dzięki!

EDYCJA: Jeśli przesłonię metodę OnPaintBackground w kontrolerze użytkownika i zapobiegnę pomalowaniu tła, to działa, jakkolwiek, że to mes Messa z przezroczystymi częściami obrazu PNG im obraz w kontroli za pomocą DrawImage, co ma sens.

Odpowiedz

6

Windows Forms w rzeczywistości nie obsługuje przezroczystych elementów sterujących.
Można obejść to ograniczenie, zastępując właściwość CreateParams kontrolki i ustawiając styl niestandardowy (wyszukaj go w google).
Co więcej, należy zastąpić obraz kontrolki, aby zmienić nie tylko kontrolę, ale także kontrolę nadrzędną. Powodem jest to, że tło musi zostać pomalowane, zanim twoja kontrola sam się maluje.
Wreszcie należy nadpisać metodę OnPaintBackground, tak jak to zrobiliście, aby upewnić się, że nie jest malowane żadne tło.

Dość niezgrabne i nie idealne, ale powinno działać.

+0

Czy chcesz używać flagi WS_CLIPCHILDREN podczas tworzenia okna kontrolnego? – TheCodeJunkie

+0

Nie Myślę, że masz na myśli WS_EX_TRANSPARENT – TheCodeJunkie

+1

Po prostu to sprawdziłem. powinieneś użyć OR właściwości ExStyle obiektów CreateParams z EX_TRANSPARENT (0x00000020) –