2
使用c#/ windows窗體。試圖使表單的背景透明,而不會失去接受點擊的能力。帶有無法點擊的透明背景的Windows窗體
this.Opacity使得整個形式透明(不只是背景
背景色= Color.Red;
TransparencyKey =背景色;
使得形式的背景透明且點擊通過我希望表單透明,但應該能夠接受點擊
怎麼樣?
使用c#/ windows窗體。試圖使表單的背景透明,而不會失去接受點擊的能力。帶有無法點擊的透明背景的Windows窗體
this.Opacity使得整個形式透明(不只是背景
背景色= Color.Red;
TransparencyKey =背景色;
使得形式的背景透明且點擊通過我希望表單透明,但應該能夠接受點擊
怎麼樣?
您需要處理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;
}
}
這是一件瞭解很酷的事情,但在這種情況下似乎不起作用。當我在窗體中重寫WndProc,並將BackColor和TransparencyKey設置爲紅色時,當將鼠標移動到透明區域時,WndProc根本不會被調用,所以我沒有機會設置m.Result HTCAPTION。你可以試試這個嗎?我很好奇,看看這是否會正常工作。 – MusiGenesis 2009-09-17 02:30:29
檢查您是否在調用switch.()中的所有其他情況時調用base.WndProc(ref m),因爲您應該這樣做。我忽略了爲簡單起見,但我認爲我需要將它添加到片段 – Rom 2009-09-17 04:14:23
我不太明白這一點 - m.LParam.ToInt32()>> 16和m.LParam.ToInt32()&0xffff .... 無論如何,我刪除了代碼,無論如何運行if塊,窗體設置爲htcaption,透明窗體的行爲像一個標題,但它仍然是點擊通過:( – 2009-09-17 05:13:15