捕捉鼠标事件时的透明背景?

时间:2009-05-19 13:18:53

标签: c# windows winforms transparency

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

我有一个带面板的表格。窗口是无边框的,并设置为面板的确切大小(对于所有意图和目的,就好像面板是'自由浮动')。我可以将面板的BackColor设置为SystemColors.Control,然后将窗口的TransparencyKey设置为相同。这样可以达到预期的效果(透明度),但面板无法再捕获鼠标事件(这对功能至关重要)!

还有另一种解决方法,或者重新启用鼠标捕获的方法吗?

我已经尝试重写OnPaintBackground并做了一个noop,但这并没有达到真正的透明度,因为它不会在每次滴答后更新背景(因此无论你是否在初始抽奖时面板后面的任何内容都会保留移动面板或以其他方式更新它)。但是,它确实允许小组捕获鼠标事件。

在项目的这个阶段,这并不是那么麻烦,但我在快速原型中偶然发现了问题,现在开始烦我了。如果有人有任何指示,他们将非常感激。

2 个答案:

答案 0 :(得分:2)

如果您使用的是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.
    }
}

答案 1 :(得分:1)

我真的没有给你一个答案,但我确实有另一种(也许是一种“hacky”)方式让你完成你想要做的事情。

将Forms Opacity属性设置为1%(不要弄乱透明度键),现在它将捕获事件。表单将不可见(至少在我的机器上1%,我根本看不到它),你仍然可以捕获所有鼠标点击。

相关问题