【问题标题】:Windows Forms custom control painting stopsWindows 窗体自定义控件绘制停止
【发布时间】:2014-04-18 13:32:52
【问题描述】:

我正在制作一个自定义控件来绘制我的模拟。问题是,当不断使其无效时(这是必需的,因为每个刻度都会改变外观)它会阻止绘制其他控件(例如属性网格是只要我用鼠标在模拟中拖动对象就不会更新)。

如何防止这种行为? windows窗体的绘制是如何工作的?此外,当表单上有此控件的两个实例时,第一个会阻止第二个。所以只有一个被绘制,另一个保持空白。

这里有人做过复杂的用户控件吗?我不能使用其他渲染机制,因为该程序应该用于可能没有适合硬件加速绘图的显卡的办公环境。

//编辑:发现问题。我在子方法 facepalm

的 drawcall 中有一个 Invalidate()

【问题讨论】:

  • 当你说绘制每个刻度时,你指的是多久一次?
  • 当拖动模拟的一部分时,我希望它能够实时更新。所以在这种情况下,每个鼠标移动事件。
  • 理想情况下,这只是您实际拖动某些东西时的每个MouseMove 事件,对吗?需要牢记的重要一点是,当您真正需要它时始终无效,理想情况下只有需要重新绘制的区域。
  • 鼠标移动速度非常快。我想我会把它(模拟重绘)限制在每秒 50 次。当窗体上只有一个控件时,它还会在其中绘制 2000 个对象。它只是放慢了速度。但我不明白为什么我的控件会阻止绘制其他控件。我也无法确定在进行模拟时要重绘哪些部分,因为仅绘制它更便宜。想象一下 100 个物体,它们都改变了一小部分。连接线也会改变颜色。检查所有这些没有意义(我的观点,如果错误,请纠正)
  • 我以前画过一些(我认为是的)复杂的自定义控件,但从未体验过您所描述的内容。我只是想涵盖核心问题,以防你可能只是因为不断的绘图而使 CPU 过载。只绘制您需要的部分可能是您需要做的,尽管您可能需要使用更复杂的数据结构来表示您的对象,以便更轻松地确定哪些对象受到影响。

标签: c# winforms controls paint


【解决方案1】:

好的,肮脏的解决方法传入:

我使用表单计时器来不断重绘我的东西。这可以防止gui锁定。太丑了……

【讨论】:

    【解决方案2】:

    我知道我迟到了,但你可能想看看 Form.OnIdle 事件。

    当您的应用的消息队列变空时会发生此事件,这意味着所有其他 UI 更新和用户事件处理都已完成(目前)。除非你有一些东西一直在生成源源不断的消息流,否则它们往往会在 UI 交互期间突然出现。爆发结束是更新自定义控件的好时机。

    IMO,计时器根本不是什么乱七八糟的东西。这是建立最小更新频率的好方法。通常,仅当显示的信息发生更改或窗口覆盖然后又揭开您的窗口时,才需要更新,从而强制重绘。但是,如果您没有以这种方式跟踪更改,或者基础信息每秒更改数百次,则计时器是一种限制更新的好方法,以便它们仅在特定频率范围内发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多