【问题标题】:Form background transparency but still have click events表单背景透明但仍有点击事件
【发布时间】:2012-11-09 16:04:41
【问题描述】:

我一直在努力解决这是否可行。

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

目前我尝试使用 Form.TransparencyKey 和 BackColor,但随后我丢失了来自透明部分的点击事件。我还尝试使用 99% 透明的 png 作为 BackgroundImage,但这只会给出深灰色背景。

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

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

【问题讨论】:

  • 对眼睛透明的窗口的任何部分对鼠标事件也是透明的。这是设计使然,无法更改。如果窗口属于同一个线程,则使用 IMessageFilter。如果没有,那么您将需要一个由 SetWindowsHookEx() 设置的低级鼠标挂钩。请注意,视频上的透明度覆盖往往效果不佳,它们使用相同的视频硬件功能。严重闪烁并不少见。

标签: c# winforms mono


【解决方案1】:

由于事实证明这是不可能的,我最终将第二个动态生成的表单浮动在顶部,不透明度设置为 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 中看不到,这可能是可修复的,但我尚未对此进行研究。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多