簡體   English   中英

如何制作真正透明的控件?

[英]How do I make a genuinely transparent Control?

我需要創建一個只顯示輪廓的控件,我需要將它放在顯示視頻的控件上。 如果我使我的控件透明,那么視頻會被遮擋,因為透明控件是由其父控件繪制的,而視頻不是由控件繪制的; 它使用DirectShow或其他庫顯示,因此父控件繪制其BackColor。

所以-我可以說沒有得到畫可言 ,除非它是不透明的控制? 這樣,父控件就不會在視頻上繪畫。

我知道我可以用四個控件制作邊框(或者更多,如果我想要它破了)但是有可能只使用一個控件做我想要的嗎?


rslite是對的 - 盡管你甚至不需要像他的例子一樣使用PInvoke - Control.Region屬性就足夠了。

您可以嘗試創建一個內部有一個洞的區域,並使用SetWindowRgn設置控制區域。

這是一個例子 (我找不到更好的一個)。 想法是創建兩個區域並從外部區域中減去內部區域。 我認為應該給你你需要的東西。

我使用類控件的重寫函數。

  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 

您可以擴展此類以進行自己的控制。 調試后,該類將出現在工具箱中。

希望這可以解決問題。

您可以嘗試設置Form.TransparencyKey屬性。 如果做不到這一點,您可以使用DirectX來訪問幀緩沖區並直接繪制到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM