【问题标题】:Windows form with a transparent background that cannot be clicked through具有无法单击的透明背景的 Windows 窗体
【发布时间】:2009-09-16 23:43:26
【问题描述】:

使用 c#/windows 窗体。尝试使表单的背景透明,同时又不会失去接收点击的能力。

  1. this.Opacity 使整个表单透明(不仅仅是背景

  2. BackColor = Color.Red;
    TransparencyKey = 背景色;

使表单的背景透明并且可以点击。我希望表单是透明的,但它应该能够接收点击

怎么做?

【问题讨论】:

    标签: c# winforms transparency


    【解决方案1】:

    您需要处理 WM_NCHITTEST。请注意,在下面的 sn-p 中,m.lParam 包含相对于屏幕左上角的鼠标位置的打包 X 和 Y 坐标,您需要检查该位置是否与您的透明区域匹配。

    在此示例中,我返回 HTCAPTION,这意味着该区域的行为类似于窗口的标题,即用户将能够通过单击并拖动此位置来拖动窗口。请参阅here 可以返回哪些其他值以及它们的含义

    protected override void WndProc(ref Message m) {
        switch (m.Msg) {
        case 0x84: // this is WM_NCHITTEST
            base.WndProc(ref m);
            if ((/*m.LParam.ToInt32() >> 16 and m.LParam.ToInt32() & 0xffff fit in your transparen region*/) 
              && m.Result.ToInt32() == 1) {
                m.Result = new IntPtr(2);   // HTCAPTION
            }
            break;
        default:
            base.WndProc(ref m);
            break;
        }
    }
    

    【讨论】:

    • 这是一件很酷的事情,但在这种情况下似乎不起作用。当我在表单中覆盖 WndProc 并将 BackColor 和 TransparencyKey 设置为红色时,当我将鼠标移到透明区域上时根本不会调用 WndProc,因此我没有机会将 m.Result 设置为宏图。你能试试这个吗?我很好奇这是否能正常工作。
    • 检查你是否在 switch() 中的所有其他情况下调用 base.WndProc(ref m),因为你应该这样做。为简单起见,我省略了它,但我认为我需要将其添加到 sn-p
    • 我不太明白这个 - m.LParam.ToInt32() >> 16 和 m.LParam.ToInt32() & 0xffff ....无论如何我删除了这段代码,if 块运行无论如何,表单设置为 htcaption,透明表单的行为确实像标题,但它仍然是可点击的:(
    • 它要么表现得像一个标题(即您通过点击那里拖动窗口),或者它是可点击的(即当您点击时,您窗口后面的窗口会收到点击)。那是哪一个?
    • RE m.LParam 数学:m.LParam 包含鼠标指针相对于屏幕左上角的 X 和 Y 坐标:顶部 16 位包含 Y,底部 16 位包含 X。如果您需要将此功能限制在窗口内的有限区域而不是整个窗口,则需要计算 X 和 Y,然后将它们与您的区域进行匹配,这就是注释部分的内容。如果不需要区域计算:删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2021-05-20
    • 2016-02-05
    • 2011-05-06
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多