【问题标题】:C++ abstract user interface designC++抽象用户界面设计
【发布时间】:2013-03-07 22:05:36
【问题描述】:

我正在为各种目标编写一个跨平台的 UI 工具包,其中一些是嵌入式的。其中一些平台支持“保留”渲染模式,其中一些更“即时”,所以我认为对于我的视觉效果我有两棵树 - 伪代码:

abstract class Visual 
{
    Visual( Widget widget ) { this.widget = widget; }
}

abstract class RetainedVisual : Visual
{
    abstract void Setup( Renderer r );
    abstract void Teardown( Renderer r );
}

abstract class ImmediateVisual : Visual
{
    abstract void Paint( Renderer r );
}

到目前为止一切顺利。但是现在我也有 ContainerVisual 类来编码小部件层次结构:

abstract class ContainerVisual : Visual
{
    void AddChild( Visual child ) {}
}

这迫使我拥有一个开始看起来臃肿的ImmediateContainerVisualRetainedContainerVisual 类。更好的设计想法?

【问题讨论】:

  • 因此出现了“伪代码”这个词,Joachim。最终设计必须可以在 C++ 中实现(因此:没有反射或其他狡猾的东西)。
  • retained 是否意味着缓冲?此外,您还没有说明 RetainedVisualImmediateVisual 之间的功能差异应该是什么,或者它们有什么共同点(它们共享一个基类,但显然没有虚拟方法或数据)。
  • “保留”意味着您将图形提交到上下文,然后忘记它们(直到发生变化)。所以“设置”将图形一次推送到渲染器中。和“拆解”删除它们。 “立即”意味着您将每帧连续绘制一次图形到渲染器中。你不需要使东西无效,因为它通常都会被重绘。

标签: c++ oop model-view-controller user-interface


【解决方案1】:

在没有更多信息的情况下很难决定要走的路:保留/立即在功能方面有什么区别?容器有什么作用?

不过,在 C++ 中,您可能会考虑为容器之类的东西使用类模板:

template <typename BaseType>
class ContainerVisual : public BaseType
{
public:
    void AddChild(BaseType & /*or smart pointer or whatever*/ child ) {}
}

【讨论】:

  • 在保留模式下,调用 Setup(Renderer r) 绘制图形,调用 Teardown(Renderer r) 将其删除。该框架处理刷新和重绘,因为它缓存了所有基元的位置以及它们的外观。在即时模式下,您每帧调用 Paint(Renderer r) - 它是较低级别的,通常只涉及将像素推送到帧缓冲区,没有图元的概念。您不必担心失效,因为本质上您总是重新绘制。
  • 容器小部件包含子小部件,因此必须将正确的接口传播给子小部件。
【解决方案2】:

最好的选择是将这 3 个类组合成同一个 Visual 类:

class Visual {
   Visual(Widget w);
   bool SupportsSetupTearDown();
   bool SupportsPaint();
   abstract void Setup(Renderer r);
   abstract void TearDown(Renderer r);
   abstract void Paint(Renderer r);
};

那么容器小部件不会有任何问题。所有的视觉都应该实现这两种渲染方法,当目标改变时,系统将开始调用不同的函数。这也允许有条件地不实现一种方式,并且可以构建特殊的视觉效果,从 SetupTearDown 转换为 Paint,从 Paint 转换为 SetupTearDown。

【讨论】:

  • 谢谢 - 这是我的方向,但我对这些“厨房水槽”界面感到有点不舒服,它们看起来不太OO。另一方面,类膨胀似乎也不是很好。岩石和坚硬的地方。
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多