3

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

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

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

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

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

4

2 回答 2

2

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

快速搜索会发现此线程可能对您有所帮助:

捕获所有鼠标事件

我希望您已经尝试过使用以下内容:

/// <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.
    }
}
于 2009-05-19T14:36:46.733 回答
1

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

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

于 2009-05-19T13:46:31.920 回答