Guis中的失效/刷新系统算法

时间:2011-03-13 14:26:52

标签: java .net c++

我正在为游戏制作一个Gui,我只希望Gui在必要时重绘一个小部件。是否有算法知道小部件何时需要失效?否则它似乎很容易出错。

由于

Windows的GUI如何做到这一点。

3 个答案:

答案 0 :(得分:1)

嗯......为什么需要重新绘制一个小部件有不同的原因。例如,如果窗口小部件表示状态刚刚更改的内容,那么显然应该更新窗口小部件以反映新状态。然后,可能需要重新绘制窗口小部件,因为窗口上方显示了另一个窗口,并且该窗口刚刚关闭,因此窗口小部件需要再次显示。

在前一个示例中,小部件本身应该让UI框架知道它需要更新(因为只有小部件知道它的状态已经改变);相反,在第二个例子中,小部件很可能无法知道它被另一个小部件暂时“隐藏”了一段时间(因为它没有直接引用该随机小部件),所以这次UI框架应该小心启动重绘。

我只想指出,你现在的问题无法得到合理的回答:小部件的绘制和更新可以通过多种方式实现,它的完成方式高度依赖于你正在使用的特定UI框架为您的GUI。因此,如果您使用已知的UI框架,我们必须首先了解;如果是这样,我们然后可能会告诉您如何在特定框架中完成小部件更新。

另一方面,如果您计划编写自己的GUI框架,我认为一个好的开始是考虑(1)小部件和框架之间的通知消息流,以及(2)哪些组件在框架中负责启动和执行小部件绘图。


P.S。:示例算法:

......我在实践中没有尝试过,所以把它当作一个起点而不是一个工作程序:

  1. 每当窗口小部件更改状态(这也包括输入焦点的获取或丢失等)时,都会发送更改通知。

  2. 更改通知从无效窗口小部件“冒泡”到其父控件,从那里到祖父窗口控件等,直到它到达可视树中的某个根控件。

  3. 一旦通知消息到达根目录,更新/重绘命令将“冒泡”整个可视树:

  4. 接收重绘命令的每个控件首先检查它的哪个直接子控件与最初失效的小部件重叠;控件只会向那些重叠的子控件广播重绘命令,其他所有子控件都不会得到消息(否则,绝对会重新绘制GUI中的每个元素)。

  5. 现在我确信这不会很好地开箱即用,并且可以通过双缓冲,部分重绘小部件,优化的消息路径等方式进行大量优化。我建议您研究几种不同的方法UI框架,以了解通常如何完成此操作,以及您有哪些选项!

答案 1 :(得分:1)

  

是否有算法知道小部件何时需要失效?

通常在更改窗口小部件的属性时。

如果查看标准的Swing组件,当调用setFont(),setBackground(),setText(),setLocation(),setSize()等方法时,它们总是会重新绘制。

我不知道你的小部件买了什么你应该遵循相同的概念,也就是你改变一个影响小部件的绘制陈述的属性然后revalidate()和重绘()它。

答案 2 :(得分:0)

这不是你问题层面的算法。

在OO世界中,你将从'小部件'中创建一个对象 那么'小部件'就会知道它在世界上的位置。

然后您可以检查是否有任何其他窗口小部件与其重叠以进行重绘 - 或者是否已移动等。