Windows窗体自定义控件绘画停止

问题描述 投票:0回答:2

我正在制作一个自定义控件,用于绘制模拟图。问题是,当不断地使它失效时(因为每一次勾选都会改变外观,所以需要这样做),它阻止了其他控件的绘制(例如,只要我在模拟中用鼠标拖动一个对象,属性网格就不会更新)。

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

这里有谁已经做了复杂的用户控件?我不能使用其他的渲染机制,因为这个程序应该是在办公环境中使用的,而办公环境可能没有合适的显卡来进行硬件加速绘制。

/edit:发现问题了。我的drawcall中的一个子方法中的Invalidate()。捂脸

c# winforms controls paint
2个回答
0
投票

好吧,肮脏的工作方法来了。

我使用了一个表单定时器来不断地重新绘制我的东西,这样可以防止gui锁定,它很丑陋... ...


0
投票

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

当你的应用程序的消息队列清空时,这个事件就会发生,这意味着所有的消息队列都被清空了。其他 UI更新和用户事件处理就完成了。除非你有一些一直在生成持续的消息流,否则在UI交互过程中它们往往会以突发的方式出现。一个突发事件的结束是更新你的自定义控件的一个非常好的时间。

我认为,定时器根本不是一个混乱的黑客。这是一个建立最低更新频率的好方法。通常情况下,只有当显示的信息发生变化,或者一个窗口覆盖了你的窗口,然后又揭开了你的窗口,迫使你重新绘制时,才需要更新。但如果你不是以这种方式跟踪变化,或者底层信息每秒变化数百次,定时器是一个很好的方式来节制你的更新,使它们只发生在一定的频率范围内。

© www.soinside.com 2019 - 2024. All rights reserved.