2009-09-16 74 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