我有 3 个数据图,它们是通过其绘制事件绘制的。
当我需要将数据插入到图表中时,我调用控件 invalidate() 命令。
第一个控件的绘制事件实际上为其他 2 个图形创建了一个位图缓冲区,以避免重复长循环。
因此无效命令按特定顺序排列 (1,2,3)。这种方法效果很好,但是当图形数据到达图形窗口 (PictureBox) 的末尾时,数据通常会开始滚动,绘制事件开始以错误的顺序触发 (2,3,1)。
以前有人遇到过这个吗?为什么会发生这种情况?
更改您的代码,以便在调用之前Invalidate
在这三个控件中的任何一个上,创建一个共享位图缓冲区(可以想象为控件类的静态成员),并且then call Invalidate
在每个控件上。在控制范围内Paint
如果发生这种情况,您可以使用静态位图缓冲区,并且顺序无关紧要Paint
事件火。
你打电话时Invalidate
在控件上,您基本上是告诉操作系统向该控件发送 WM_PAINT 消息。因为它是 Windows 消息,所以只要 Windows 开始执行它,就保证会传递它。就您而言,它们通常会按照收到的顺序交付,但有时却不会。
代码中需要考虑的另一件事是:当您将相对复杂的绘图代码放入控件的内部时Paint
事件处理程序(或直接从Paint
事件处理程序),每当控件失效时都会执行此代码出于任何原因,这意味着代码将在您调用时运行Invalidate
,但只要将另一个窗口拖到控件上,它也会运行。
对于复杂、耗时的图形,最好在隐藏缓冲区(一个Bitmap
或看不见的PictureBox
或其他),然后在控件中Paint
事件从隐藏缓冲区到可见窗口进行简单的复制(使用Graphics.DrawImage
or BitBlt
管他呢)。
如果您在绘制的缓冲区和可见窗口之间添加第二个缓冲区(因此称为“双缓冲”),这种方法还可以让您避免闪烁。在主缓冲区上完成绘制后,将其复制到第二个缓冲区上。在控件的Paint
事件,您从第二个缓冲区复制到可见窗口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)