形成背景透明度但仍有点击事件

时间:2012-11-09 16:04:41

标签: c# winforms mono

如果可能的话,我一直在努力解决。

基本上我想要的是拥有一个边框正常但具有透明背景的表单。在这个区域,我想要实时显示背后的内容(极有可能是视频),我可以捕捉点击事件,以便在我的过度表格中显示更多信息。

目前我曾尝试使用Form.TransparencyKey和BackColor,但之后我丢失了from的透明部分中的click事件。我还尝试使用99%透明的png作为BackgroundImage,但这只是一个深灰色的背景。

我已经注意到如果我绘制间隙(即简单的线条),我可以捕获这些上的点击事件,而不是透明部分。有没有办法我可以在油漆上画一个半透明的矩形呢?

如果可能的话,我希望这是单声道兼容的。

1 个答案:

答案 0 :(得分: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);
        }

根据MoMa工具,这是100%单声道兼容,并且代码按照预期在MonoDevelop中编译。但是,如果我运行这个,我看到一个空引用异常,我没有在加载的MS .NET中看到,这可能是可修复的,但我还没有调查。