我创建了一个半透明表单。我希望人们能够点击表单区域,但不希望表单处理点击。我希望表单下方的任何内容都能够接收到点击事件。
我创建了一个半透明表单。我希望人们能够点击表单区域,但不希望表单处理点击。我希望表单下方的任何内容都能够接收到点击事件。
您可以使用SetWindowLong
来实现此目的:
int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);
这里有几个魔数:
-20
– GWL_EXSTYLE
获取扩展窗口样式。
0x80000
– WS_EX_LAYERED
创建分层窗口。
0x20
– WS_EX_TRANSPARENT
指定使用此样式创建的窗口在同一线程下创建的兄弟窗口未被绘制之前不应该被绘制。在其它同级窗口已经被绘制后,该窗口会立马出现透明效果。
网上有很多文章介绍如何实现这些功能,例如这篇文章。
@Joey的回答中的SetWindowLong
只能在屏幕上显示表单后使表单半透明。如果您在Form1_Load
中调用SetWindowLong
,则该表单将在创建时不透明,然后迅速变为半透明。这会导致用户在启动程序时短暂地看到非半透明表单。为了防止这种情况,您可以覆盖CreateParams
:
public partial class Form1 : Form
{
protected override CreateParams CreateParams
{
get
{
const int WS_EX_LAYERED = 0x80000;
const int WS_EX_TRANSPARENT = 0x20;
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_LAYERED;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
}
上述代码使表单在屏幕上显示之前半透明。
上述解决方案类似于此帖子,使表单处于最顶层。