Как мне сделать действительно прозрачный элемент управления? - PullRequest
5 голосов
/ 21 ноября 2008

Мне нужно создать элемент управления, который показывает только контур, и мне нужно разместить его над элементом управления, который показывает видео. Если я сделаю свой элемент управления прозрачным, тогда видео будет скрыто, потому что прозрачные элементы управления закрашены их родительским элементом управления, а видео не закрашено элементом управления; он отображается с использованием DirectShow или другой библиотеки, поэтому родительский элемент управления рисует свой BackColor.

Итак - могу ли я создать элемент управления, который не будет окрашен вообще , кроме случаев, когда он непрозрачный? Таким образом, родительский элемент управления не будет закрашивать видео.

Я знаю, что могу сделать границу из четырех элементов управления (или больше, если я хочу, чтобы она была пунктирной), но возможно ли сделать то, что я хочу, используя только один элемент управления?


rslite прав - хотя вам даже не нужно заходить так далеко, чтобы использовать PInvoke, как его пример - свойство Control.Region вполне достаточно.

Ответы [ 3 ]

4 голосов
/ 21 ноября 2008

Вы можете попытаться создать регион с отверстием внутри и установить область управления с помощью SetWindowRgn.

Вот пример (я не смог найти лучшего). Идея состоит в том, чтобы создать две области и вычесть внутреннюю из внешней. Я думаю, что это должно дать вам то, что вам нужно.

0 голосов
/ 31 декабря 2013

Я использую переопределенную функцию для этого из элемента управления класса.

  1. Свойство createparams теперь указывает, что элемент управления может быть прозрачным.

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

  3. Вы должны отключить автоматическое рисование заднего цвета из элемента управления (')

    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
    

Вы можете расширить этот класс, чтобы создать собственный контроль. После отладки класс появится в наборе инструментов.

Надеюсь, это поможет.

0 голосов
/ 21 ноября 2008

Вы можете попробовать установить свойство Form.TransparencyKey. В противном случае вы могли бы использовать DirectX для получения доступа к буферу кадров и рисования непосредственно к нему.

...