2008-11-21 3 views
5

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

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

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


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

ответ

4

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

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

-1

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

+0

Я неправильно понял вопрос. Хотя формы можно сделать прозрачными и показать видео через них, сделать то же самое с формой control/child намного сложнее и требует, чтобы элементы управления под прозрачным элементом управления увеличивали события рисования при их обновлении. – Skizz 2008-11-21 15:21:27

0

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

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

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

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

    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 может расширить этот класс, чтобы сделать свой собственный контроль. После отладки класс появится в панели инструментов.

Надеюсь, что это трюк.

Смежные вопросы