2012-11-09 78 views
0

我一直在努力解決,如果這是可能的。表單背景的透明度,但仍然有點擊事件

基本上我想要的是一個帶邊框的窗體,但是具有透明背景。在這個區域,我想要實時顯示背後的內容(很有可能是視頻饋送),我可以捕獲點擊事件以在我的表單上顯示更多信息。

目前我已經嘗試使用Form.TransparencyKey和BackColor,但我然後失去了從透明部分的點擊事件。我也試圖使用99%透明PNG作爲BackgroundImage,但這只是給出了深灰色的背景。

我注意到,如果我畫空白(即一個簡單的線),我可以捕捉點擊事件在這些,而不是透明部分。有沒有辦法,我可以在第一次繪製一個半透明的矩形?

我希望這是單聲道兼容的,如果可能的話。

+0

對於眼睛而言透明的窗口的任何部分對於鼠標事件都是透明的。這是設計而不能改變的。如果窗口屬於同一個線程,則使用IMessageFilter。如果沒有,那麼你需要一個由SetWindowsHookEx()設置的低級別的鼠標鉤子。請注意,透明度覆蓋視頻的效果往往不佳,它們使用相同的視頻硬件功能。沉重的閃爍並不少見。 –

回答

0

由於事實證明這是不可能的,我最終將Opacity設置爲0.01的第二個動態生成的表單懸浮在頂部。然後,我使用主窗體上的Resize和LocationChanged事件調整大小,並根據需要移動疊加窗體。然後我只需要處理疊加窗體點擊事件就可以根據需要進行處理。

public MainFrom() 
    { 
     InitializeComponent(); 

     f = new Form(); 
     f.Size = panel1.Size; 
     f.FormBorderStyle = FormBorderStyle.None; 
     f.BackColor = Color.Black; 
     f.Opacity = 0.01; 
     f.ShowInTaskbar = false; 
     f.Show(this); 

     f.Click += new System.EventHandler(this.UserClicked); 
    } 

此代碼,然後重新調整疊加的形式佔主要形式邊界:

private void SetLocation() 
     { 
      // These next 2 lines calculate the width of the border 
      // and the title bar and then use these to off set the floating 
      // forms location correctly. 
      int xOffset = (this.Width - this.ClientSize.Width)/2; 
      int yOffset= this.Height - this.ClientSize.Height - xOffset; 
      int x = this.Location.X + panel1.Location.X + xOffset; 
      int y = this.Location.Y + panel1.Location.Y + yOffset; 
      f.Location = new Point(x, y); 
     } 

根據現代藝術博物館的工具,這是100%的單兼容和代碼編譯在MonoDevelop的預期。但是,如果我運行這個,我看到一個空引用異常,我沒有看到在加載MS .NET中,這可能是可以修復的,但我還沒有看到這一點。