2009-09-16 78 views
2

使用c#/ windows窗體。試圖使表單的背景透明,而不會失去接受點擊的能力。帶有無法點擊的透明背景的Windows窗體

  1. this.Opacity使得整個形式透明(不只是背景

  2. 背景色= Color.Red;
    TransparencyKey =背景色;

使得形式的背景透明且點擊通過我希望表單透明,但應該能夠接受點擊

怎麼樣?

回答

3

您需要處理WM_NCHITTEST。在下面的代碼片段中注意,m.lParam包含相對於屏幕左上角的鼠標位置的打包X和Y座標,並且您需要檢查該位置是否與您的透明區域相匹配。

在這個例子中,我返回了HTCAPTION,這意味着這個區域的行爲就像窗口的標題,即用戶可以通過點擊並拖動這個位置來拖動窗口。請參閱here可以返回哪些其他值以及它們的含義

protected override void WndProc(ref Message m) { 
    switch (m.Msg) { 
    case 0x84: // this is WM_NCHITTEST 
     base.WndProc(ref m); 
     if ((/*m.LParam.ToInt32() >> 16 and m.LParam.ToInt32() & 0xffff fit in your transparen region*/) 
      && m.Result.ToInt32() == 1) { 
      m.Result = new IntPtr(2); // HTCAPTION 
     } 
     break; 
    default: 
     base.WndProc(ref m); 
     break; 
    } 
} 
+0

這是一件瞭解很酷的事情,但在這種情況下似乎不起作用。當我在窗體中重寫WndProc,並將BackColor和TransparencyKey設置爲紅色時,當將鼠標移動到透明區域時,WndProc根本不會被調用,所以我沒有機會設置m.Result HTCAPTION。你可以試試這個嗎?我很好奇,看看這是否會正常工作。 – MusiGenesis 2009-09-17 02:30:29

+0

檢查您是否在調用switch.()中的所有其他情況時調用base.WndProc(ref m),因爲您應該這樣做。我忽略了爲簡單起見,但我認爲我需要將它添加到片段 – Rom 2009-09-17 04:14:23

+0

我不太明白這一點 - m.LParam.ToInt32()>> 16和m.LParam.ToInt32()&0xffff .... 無論如何,我刪除了代碼,無論如何運行if塊,窗體設置爲htcaption,透明窗體的行爲像一個標題,但它仍然是點擊通過:( – 2009-09-17 05:13:15