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

时间:2011-08-11 19:24:24

标签: winforms user-controls

我刚刚找到了一个问题,我的一个UserControl神秘地停止了触发Paint事件。

原来,BorderStyle被意外设置为无。当我将它设置回FixedSingle时,Paint事件再次开始触发。

这令我感到惊讶 - 任何想法为什么会发生这种情况?

修改 UserControl基于第三方控件(ASE ChartDirector),我们遇到了另一个问题。当它的BackColor设置为透明时,它会连续触发Paint事件 !.在这种情况下的解决方法是将BackColor设置为ControlLightLight。 (see this question for more details)

这也可能是BorderStyle问题的线索吗?

1 个答案:

答案 0 :(得分:0)

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

更新:本文适用于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);
    }

我搜索过但无法获得更多信息。