捕获鼠标事件时保持背景透明?

3
这里似乎有一个类似的问题,但是与此问题相反(他不想捕获鼠标事件)。
我有一个带面板的表单。窗口没有边框,并设置为面板的确切大小(实际上,就好像面板是“自由浮动”的一样)。我可以将面板的BackColor设置为SystemColors.Control,然后将窗口的TransparencyKey设置为相同的颜色。这样做可以实现所需的效果(透明),但是该面板无法再捕获鼠标事件(这对功能至关重要)!
是否有另一种方法解决此问题或重新启用鼠标捕获?
我尝试重写OnPaintBackground并执行noop,但这并没有实现真正的透明度,因为它不会在每次tick之后更新背景(因此,无论您是否移动面板或以其他方式更新它,初始绘制时面板后面的任何内容都会保留在那里)。但是,它确实允许面板捕获鼠标事件。
在项目的这个阶段,这并不是什么大问题,但我在快速原型期间遇到了这个问题,现在开始让我感到烦恼。如果有人有任何指针,他们将不胜感激。
2个回答

2
如果您正在使用VC ++,我会说您需要一个消息泵来处理WM_mouse事件消息。
快速搜索显示这个线程可能对您有所帮助: 捕获所有鼠标事件 我想您已经尝试使用以下内容了:
/// <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.
    }
}

嗨,ChrisBD - 感谢您的帮助。上述方法“有点”有效。我会继续尝试并看看是否能够完善它。再次感谢! - HalliHax
同样的问题!如果您已经找到解决方案,请更新主题! - Pedro77

1

我并没有一个确切的答案给你,但我有另一种(也许有点“hacky”)方法可以帮助你完成你想做的事情。

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


嗨,BFree - 謝謝您的回覆,但對我來說這不是一個可行的選擇 - 因為面板有子控件需要顯示。無論如何,還是謝謝! - HalliHax
是的,我就怕你会这么说。抱歉!祝你好运……其实我也很好奇是否有解决方案。 - BFree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接