2011-03-23 28 views
1

我非常困惑自己到了不归路的地步,并且觉得我的项目太庞大,无法跟上我目前的方式。有很多GUI屏幕的程序的设计方法

简而言之:

1)有许多图形屏幕(窗口),每个屏幕在其自己的.cpp定义与所附的.h头瓦特/公共&私有减速的类。

2)我正在使用FLTK GUI工具包,所以当我离开一个屏幕时,我会对其调用“hide()”,我假设它是垃圾收集,然后创建一个新的任何屏幕实例跟随。我的问题是,如果一个屏幕(屏幕A可以调用它)创建另一个屏幕(屏幕B),那么我必须在屏幕A中包含屏幕B的头文件,并且在屏幕A中创建一个屏幕B的全局指针的.cpp。

即。屏幕A的一个伪编码器

#include "screenb.h" 

ScreenB* screenb_ptr; // global 

... 
Bunch of Code, constructors, deconstructors, etc 
... 

void ScreenA::exit_and_make_screen_b() 
{ 
    ScreenA.hide(); 
    screenb_ptr = new ScreenB(); 
} 

这是最好的方法吗?我觉得它很sl((还有一个内存泄漏?),我应该有一个类似于.cpp/.h的虚拟内存来跟踪一堆extern-qualified指针;特别是因为有时我必须返回/前进屏幕(即可以从其他多个屏幕跳回到主菜单屏幕)。任何建议表示赞赏!

回答

2

这里有几个建议:

  1. 创建所有屏幕包括一个新的头文件。然后你可以包含这个头文件并捕获你所有的其他屏幕头文件。
  2. 您可能会考虑一个屏幕管理器,它可以保留对屏幕的所有引用。屏幕之间的导航将留给您的屏幕管理员处理所有引用和指针。这样你就不会把屏幕连接在一起,而是通过一个共同的媒介进行交流。

例如:

screenManager->NavigateScreen(SCREEN_USER_PROFILE); 

所有屏幕都可以从保存的指针屏幕经理(他们需要通过他们的构造函数或抓斗从静态单一实例)一个基类继承。这样,所有的屏幕都可以请求新的屏幕导航。

+0

好吧,我想这样做

  • 逆天,但没有C++版在一段时间。 (当我输入时,似乎我的评论被提交!)。无论如何,我把所有的标题都移到了screenmanager.h的一个头下,并且有一个screenmanager.cpp并创建了一个公共函数ScreenManager :: create(一些var,int x,int y,int l,int h,char * title)...我想要“一些var”部分来决定创建什么屏幕,但不确定如何在没有大的case语句的情况下去做。我无法从调用者传递对象,因为它不知道它的存在,因为它在screenmanager.h下抽象出来。想法? – jparanich 2011-03-23 16:58:42

  • +0

    哦,谢谢:) – jparanich 2011-03-23 17:13:50

    +0

    你可能会考虑让somevar成为枚举。然后,您可以将枚举值传递给构造函数(或导入函数)。窗口管理器内部的case语句可能是好的,因为您已将您的屏幕抽象为单个管理器。如果您需要*进一步抽象,可能会查看工厂设计模式。 – 2011-03-23 17:35:48

    1

    顺便说一句:我不完全确定FLTK的内存结构。隐藏屏幕可能根本不会删除内存,只是隐藏窗口的GUI表示,允许您稍后以相同的状态再次打开它。

    GUI的一个好方法是模型 - 视图 - 控制器体系结构,其中您有一个控制器来根据需要操作GUI。

    这将更多地体现出来:

    WindowManager wm; 
    
    void ScreenA::exit() 
    { 
         wm.registerExit(screenb_ptr); 
         wm.actOnExit(); 
    } 
    

    或者一些这样类似的事情让你的窗口的中心协调器。这允许:

    • 可插拔接口
    • 更好地组织对错误
    +0

    Upvote让我想起MVC。我正在努力将你的sol'n和j0rd4n结合起来。谢谢。 – jparanich 2011-03-23 17:22:37