2008-11-21 16 views
5

Potrzebuję kontroli, która pokazuje tylko zarys, i muszę umieścić go nad formantem, który pokazuje wideo. Jeśli sprawię, że moja kontrola będzie przezroczysta, wideo będzie zasłonięte, ponieważ przezroczyste elementy sterujące są pomalowane przez kontrolę rodzica, a wideo nie jest namalowane przez formant; jest pokazywany za pomocą DirectShow lub innej biblioteki, więc zamiast tego kontrola nadrzędna maluje swój kolor BackColor.Jak zrobić prawdziwie przezroczystą kontrolę?

Więc - czy mogę uzyskać kontrolę, która nie zostanie pomalowana na w ogóle, chyba że jest nieprzejrzysta? W ten sposób kontrola rodzica nie będzie malować obrazu wideo.

Wiem, że mógłbym utworzyć granicę z czterech kontrolek (lub więcej, jeśli chcę, żeby to było przerywane), ale czy można zrobić to, co chcę, używając tylko jednej kontrolki?


rslite ma rację - chociaż nie trzeba nawet iść tak daleko, aby użyć PInvoke jak jego przykład robi - własność Control.Region jest całkowicie wystarczające.

Odpowiedz

4

Możesz spróbować zrobić region z dziurą w środku i ustawić region kontrolny za pomocą SetWindowRgn.

Oto example (Nie mogłem znaleźć lepszego). Chodzi o stworzenie dwóch regionów i odjęcie wewnętrznego od zewnętrznego. Myślę, że to powinno dać ci to, czego potrzebujesz.

-1

Możesz spróbować ustawić właściwość Form.TransparencyKey. W przeciwnym razie możesz użyć DirectX, aby uzyskać dostęp do bufora ramki i narysować bezpośrednio do niego.

+0

Źle odczytałem pytanie. Mimo że formularze można uczynić przejrzystymi i wyświetlać je za pośrednictwem nich, to samo postępowanie z formą kontrolną/podrzędną jest znacznie trudniejsze i wymaga kontroli pod kontrolą przezroczystą, aby podnieść zdarzenia związane z malowaniem podczas aktualizacji. – Skizz

0

Używam do tego funkcji nadpisanej z kontrolki klasy.

  1. Obiekt createparams teraz wskazuje, że kontrola może być przezroczysty.

  2. InvalidateEx należy unieważnić regionu rodzica, gdy kontrola jest umieszczony

  3. Trzeba wyłączyć automatyczne farby backcolor z kontrolą (')

    Imports System.Windows.Forms.Design 
    Imports System.Reflection 
        Public Class TransparentControl : Inherits Control 
         Protected Overrides ReadOnly Property CreateParams As CreateParams 
          Get 
           Dim cp As CreateParams = MyBase.CreateParams() 
           cp.ExStyle = cp.ExStyle Or 32 'WS_EX_TRANSPARENT 
           Return cp 
          End Get 
         End Property 
         Protected Sub InvalidateEx(rct As Rectangle) 
          Me.Invalidate(rct) 
          If IsNothing(Parent) Then Exit Sub 
          Parent.Invalidate(New Rectangle(Me.Location, rct.Size), True) 
         End Sub 
         Protected Sub InvalidateEx() 
          Me.Invalidate() 
          If IsNothing(Parent) Then Exit Sub 
          Parent.Invalidate(New Rectangle(Me.Location, Me.Size), True) 
         End Sub 
         Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs) 
          'MyBase.OnPaintBackground(pevent) 
         End Sub 
    
         Protected Overrides Sub OnPaint(e As PaintEventArgs) 
          MyBase.OnPaint(e) 
          'draw the layout on e.Graphics 
         End Sub 
        End Class 
    

You może rozszerzyć tę klasę, aby uzyskać własną kontrolę. Po debugowaniu klasa pojawi się w przyborniku.

Mam nadzieję, że to wystarczy.

Powiązane problemy