2008-11-21 24 views
5

Tôi cần tạo một Điều khiển chỉ hiển thị đường viền và tôi cần đặt nó trên điều khiển hiển thị video. Nếu tôi kiểm soát trong suốt, thì video bị che khuất, bởi vì các điều khiển trong suốt được kiểm soát bởi bố mẹ và video không được kiểm soát bởi điều khiển; nó được hiển thị bằng cách sử dụng DirectShow hoặc một thư viện khác, vì vậy thay vào đó điều khiển cha mẹ sẽ vẽ BackColor của nó.Làm cách nào để thực hiện Kiểm soát thực sự minh bạch?

Vì vậy - tôi có thể tạo điều khiển không được sơn ở tất cả, trừ khi nó mờ đục không? Bằng cách đó, kiểm soát của phụ huynh sẽ không vẽ lên video.

Tôi biết tôi có thể làm cho biên giới ra khỏi bốn điều khiển (hoặc nhiều hơn nếu tôi muốn nó dashed) nhưng là nó có thể làm những gì tôi muốn bằng cách sử dụng chỉ là một điều khiển?


rslite là đúng - mặc dù bạn thậm chí không cần sử dụng PInvoke như ví dụ của mình - thuộc tính Control.Region là hoàn toàn đủ.

Trả lời

4

Bạn có thể thử tạo Vùng bằng lỗ bên trong và đặt vùng điều khiển bằng SetWindowRgn.

Đây là một số example (Tôi không thể tìm thấy cái nào tốt hơn). Ý tưởng là để tạo ra hai khu vực và trừ một bên trong từ bên ngoài. Tôi nghĩ rằng sẽ cung cấp cho bạn những gì bạn cần.

-1

Bạn có thể thử đặt thuộc tính Form.TransparencyKey. Nếu không, bạn có thể sử dụng DirectX để truy cập vào bộ đệm khung và vẽ trực tiếp vào bộ đệm đó.

+0

Tôi đã đọc sai câu hỏi. Mặc dù các biểu mẫu có thể được thực hiện trong suốt và hiển thị video thông qua chúng, làm tương tự với biểu mẫu con/điều khiển khó hơn nhiều và yêu cầu các điều khiển dưới sự kiểm soát trong suốt để tăng sự kiện sơn khi cập nhật. – Skizz

0

Tôi sử dụng chức năng ghi đè cho điều đó từ điều khiển lớp học.

  1. Thuộc tính createparams giờ đây cho biết rằng điều khiển có thể trong suốt.

  2. InvalidateEx là cần thiết để làm mất hiệu lực khu vực của cha mẹ nơi điều khiển được đặt

  3. Bạn cần phải vô hiệu hóa sơn tự động của backcolor từ sự kiểm soát (')

    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 
    

Bạn có thể mở rộng lớp này để kiểm soát của riêng bạn. Sau khi gỡ lỗi, lớp sẽ xuất hiện trong hộp công cụ.

Hy vọng điều này sẽ thực hiện thủ thuật.

Các vấn đề liên quan