我刚刚找到了一个问题,我的一个UserControl神秘地停止了触发Paint事件。
原来,BorderStyle被意外设置为无。当我将它设置回FixedSingle时,Paint事件再次开始触发。
这令我感到惊讶 - 任何想法为什么会发生这种情况?
修改 UserControl基于第三方控件(ASE ChartDirector),我们遇到了另一个问题。当它的BackColor设置为透明时,它会连续触发Paint事件 !.在这种情况下的解决方法是将BackColor设置为ControlLightLight。 (see this question for more details)
这也可能是BorderStyle问题的线索吗?
答案 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);
}
我搜索过但无法获得更多信息。