c# - 透明背景同时捕获鼠标事件?

标签 c# windows winforms transparency

这里似乎有一个与此类似的问题,但有“相反”的问题(他不想捕获鼠标事件)。

我有一个带有面板的表单。该窗口是无边界的,并设置为面板的确切大小(出于所有意图和目的,就好像面板是“自由 float ”的)。我可以将面板的 BackColor 设置为 SystemColors.Control,然后将窗口的 TransparencyKey 设置为相同。这是因为它实现了预期的效果(透明度),但面板无法再捕获鼠标事件(这对功能至关重要)!

是否有其他解决方法,或者重新启用鼠标捕获的方法?

我已经尝试覆盖 OnPaintBackground 并执行 noop,但这并没有实现真正的透明度,因为它不会在每次滴答后更新背景(因此无论您是否在初始绘制时面板后面的任何内容都保留在那里移动面板或以其他方式更新它)。但是,它确实允许面板捕获鼠标事件。

在项目的这个阶段,这并不是那么麻烦,但我在快速制作原型(prototype)时偶然发现了这个问题,现在它开始让我烦恼。如果有人有任何指示,他们将不胜感激。

最佳答案

如果您使用的是 VC++,我会说您需要一个消息泵来处理 WM_ 鼠标事件消息。

快速搜索会发现这个线程,它可能对您有帮助:

Capturing ALL mouse events

我希望您已经尝试过使用以下方法:

/// <summary>
/// A transparent control.
/// </summary>
public class TransparentPanel : Panel
{
    public TransparentPanel()
    {
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // Do not paint background.
    }
}

关于c# - 透明背景同时捕获鼠标事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/882706/

相关文章:

c# - 在表单之间共享类

c# - OU 时间戳 ComObject

c++ - 如何创建 QPixmap 的半透明拷贝?

c++ - 如何在 Windows 下用 C++ 代码创建一个新进程?

c# - 我不太明白的声明( setter = (o) => { }; )

c# - 基于c#中的两个数组查找和替换字符串中的字符

windows - 检查文件是 32 位还是 64 位 - 在 Windows 上

c# - 使用 ToolTip 类在 Grid(Winforms) 的列上添加工具提示是否可能?

c# - 带状状态标签中的倒数计时器 c#

c# - TextBox 在 '\0' 字符处截断字符串