Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有透明背景的Windows窗体,无法单击_C#_Winforms_Transparency - Fatal编程技术网

C# 具有透明背景的Windows窗体,无法单击

C# 具有透明背景的Windows窗体,无法单击,c#,winforms,transparency,C#,Winforms,Transparency,使用c#/windows窗体。尝试使窗体的背景透明,而不丧失接收单击的能力 不透明度使整个窗体透明(不仅仅是背景) 背景色=颜色。红色; 透明键=背景色 使窗体的背景透明并可以单击。我希望窗体透明,但它应该能够接收单击 如何处理?您需要处理WM_NCHITTEST。请注意,在下面的代码段中,m.lParam包含鼠标位置相对于屏幕左上角的压缩X和Y坐标,您需要检查该位置是否与透明区域匹配 在本例中,我返回HTCAPTION,这意味着该区域的行为类似于窗口的标题,即用户可以通过单击并拖动此位置来拖动

使用c#/windows窗体。尝试使窗体的背景透明,而不丧失接收单击的能力

  • 不透明度使整个窗体透明(不仅仅是背景)

  • 背景色=颜色。红色;
    透明键=背景色

  • 使窗体的背景透明并可以单击。我希望窗体透明,但它应该能够接收单击


    如何处理?

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

    在本例中,我返回HTCAPTION,这意味着该区域的行为类似于窗口的标题,即用户可以通过单击并拖动此位置来拖动窗口。查看可以返回哪些其他值及其含义

    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,并将背景色和透明键设置为红色时,当我将鼠标移到透明区域上时,WndProc根本不会被调用,所以我没有机会将m.Result设置为HTCAPTION。你能试试吗?我很好奇看看这是否能正常工作。检查您是否在switch()中调用base.WndProc(ref m),因为您应该这样做。为了简单起见,我省略了它,但我认为我需要将它添加到代码段中。我不太理解-m.LParam.ToInt32()>>16和m.LParam.ToInt32()&0xffff…不管怎样,我删除了这段代码,如果块仍然运行,窗体设置为htcaption,透明窗体的行为确实像一个标题,但它仍然是可点击的:(它的行为像一个标题(即,通过点击那里拖动窗口)或者它是可点击的(即,当您单击时,窗口后面的窗口接收到单击)。这是哪一个?RE m.LParam数学:m.LParam包含鼠标指针相对于屏幕左上角的X和Y坐标:顶部16位包含Y,底部16位包含X。如果需要将此功能限制在窗口内的有限区域(相对于整个窗口),则需要计算X和Y,然后将它们与您的区域匹配,这就是注释部分的内容。如果您不需要区域计算:将其删除。