为什么我的WinForms UserControl在BorderStyle=None时停止触发绘制事件?

为什么我的WinForms UserControl在BorderStyle=None时停止触发绘制事件?,winforms,user-controls,Winforms,User Controls,我刚刚发现了一个问题,我的一个用户控件神秘地停止了触发绘画事件 结果表明,BorderStyle被意外设置为“无”。当我将其设置回FixedSingle时,绘制事件再次开始触发 这让我大吃一惊——你知道为什么会这样吗 编辑 UserControl基于第三方控件,我们还遇到了另一个问题。当它的BackColor设置为Transparent时,它将连续激发Paint事件!。这种情况下的解决方法是将BackColor设置为ControlLight。 这也可能是边界风格问题的线索吗?这是一个非常好的博

我刚刚发现了一个问题,我的一个用户控件神秘地停止了触发绘画事件

结果表明,BorderStyle被意外设置为“无”。当我将其设置回FixedSingle时,绘制事件再次开始触发

这让我大吃一惊——你知道为什么会这样吗

编辑 UserControl基于第三方控件,我们还遇到了另一个问题。当它的BackColor设置为Transparent时,它将连续激发Paint事件!。这种情况下的解决方法是将BackColor设置为ControlLight。

这也可能是边界风格问题的线索吗?

这是一个非常好的博客,详细讨论了原因

更新:本文是针对WPF的,然而,WPF和Windows表单在某些方面都会涉及HWND、WParam和LParam

这就是为什么我认为绘画事件可能无法得到处理的原因,正如文章中所显示的那样

操作系统必须对鼠标移动做出快速响应。 Windows使用专用的原始输入线程RIT,在 内核,用于处理来自鼠标硬件的信号。RIT 快速扫描HWND层次结构以查看鼠标所在的窗口 结束由于系统必须具有响应性,因此不需要任何应用程序代码 调用。对于普通窗口,RIT检查鼠标位置 针对窗口的矩形或区域(如果已设置)。要不是 在分层窗口中,RIT在指定 并检查窗口的有效透明度 可能受“恒定不透明度”设置影响的位置 颜色关键点设置,或每像素alpha通道。如果像素是 100%透明,RIT跳过窗口并继续查看。每年一次 窗口已被定位,鼠标移动标志设置在 窗户的主人。这将导致线程接收WM_MOUSEMOVE 下次调用GetMessage时,如果没有其他消息 更高优先级的消息

虽然这特别适用于来自鼠标硬件信号的消息,但我认为其他事件也可能发生类似的情况

这就是我要做的

在Form类中,执行以下代码以监视所处理的消息

    protected override void WndProc(ref Message m)
    {
        Trace.WriteLine(m.Msg + ":" + m);
        base.WndProc(ref m);
    }

我搜索了一下,但找不到更多的信息。

真奇怪。我使用BorderStyle。我的大多数用户控件上都没有,并且它们的绘制事件仍然会触发。发布重现此问题的代码。@Hans-我会尝试,但这可能很困难-请查看我的编辑。是的,这将很困难。您正在使用一个控件,它背后有大量代码,您无法访问这些代码,而这些代码的唯一用途就是自定义绘制。请与供应商联系以获得支持。Windows通过一种称为分层Windows的功能支持HWND级别的透明度。您确实需要指向链接帖子中的一段并说:这里!这就是为什么用户控件在无边界时不重新绘制。仅顶级窗口支持分层。表单。@Nikos-我浏览了这篇博文,但这是我从未使用过的WPF,不是Winforms。而且,我看不到任何关于边界的提及。但是,您可能在正确的轨道上-控件使用透明度。我如何确定它是否使用分层窗口?@Tom Bushell-我用自己的想法更新答案。如果您觉得没有用,请随意标记为没有用:我无法获得更多信息。@Nikos-感谢您的澄清,以及WndProc的最重要技巧-这对我来说是一个新的技巧。