【发布时间】:2014-04-18 13:32:52
【问题描述】:
我正在制作一个自定义控件来绘制我的模拟。问题是,当不断使其无效时(这是必需的,因为每个刻度都会改变外观)它会阻止绘制其他控件(例如属性网格是只要我用鼠标在模拟中拖动对象就不会更新)。
如何防止这种行为? windows窗体的绘制是如何工作的?此外,当表单上有此控件的两个实例时,第一个会阻止第二个。所以只有一个被绘制,另一个保持空白。
这里有人做过复杂的用户控件吗?我不能使用其他渲染机制,因为该程序应该用于可能没有适合硬件加速绘图的显卡的办公环境。
//编辑:发现问题。我在子方法 facepalm
的 drawcall 中有一个 Invalidate()【问题讨论】:
-
当你说绘制每个刻度时,你指的是多久一次?
-
当拖动模拟的一部分时,我希望它能够实时更新。所以在这种情况下,每个鼠标移动事件。
-
理想情况下,这只是您实际拖动某些东西时的每个
MouseMove事件,对吗?需要牢记的重要一点是,当您真正需要它时始终无效,理想情况下只有需要重新绘制的区域。 -
鼠标移动速度非常快。我想我会把它(模拟重绘)限制在每秒 50 次。当窗体上只有一个控件时,它还会在其中绘制 2000 个对象。它只是放慢了速度。但我不明白为什么我的控件会阻止绘制其他控件。我也无法确定在进行模拟时要重绘哪些部分,因为仅绘制它更便宜。想象一下 100 个物体,它们都改变了一小部分。连接线也会改变颜色。检查所有这些没有意义(我的观点,如果错误,请纠正)
-
我以前画过一些(我认为是的)复杂的自定义控件,但从未体验过您所描述的内容。我只是想涵盖核心问题,以防你可能只是因为不断的绘图而使 CPU 过载。只绘制您需要的部分可能是您需要做的,尽管您可能需要使用更复杂的数据结构来表示您的对象,以便更轻松地确定哪些对象受到影响。
标签: c# winforms controls paint