Tangram:一个基于MFC框架的柔性软件开发系统
孙 辉
Tangram是一个基于MFC类库的软件开发框架,用于解决Visual C++基于MFC的软件开发中面临的若干问题, Tangram是一个开源项目。
网址:http://www.apptemplate.com/opencn/
下载地址:http://www.apptemplate.com/opencn/downloads.asp
技术支持论坛:http://www.apptemplate.com/opencn/MsgBoard/default.asp
Tangram的背景、动机与意义
一个典型的MFC程序通常是一个SDI或MDI程序,一般来说,这样的程序包含一个由CFrameWnd(或CMDIFrameWnd)派生而来的主窗口,如果是MDI界面的,还包含若干个文档模板等等。CFrameWnd通常包含一个或多个CView的派生对象,较复杂的CFrameWnd还包含由若干SplitterWnd以及若干特定风格的Tab型的窗口形成的布局结构,如下图:
(一个布局复杂的Frame窗口)
(一个布局复杂的MDIFrame窗口及其部分子窗口)
现代程序的一个醒目的特征是窗口的综合运用,在Visual Studio .NET的IDE以及MS Office系列程序中很好的体现了这个特点,功能综合、复杂的窗体的设计明显的成为一个技术问题。基于MFC类库的程序构架,由于缺乏RAD机制,因此对应的技术问题尤为明显。一般而言,绝大多数MFC程序员都将面对下列问题:
一、 主窗体的定制化设计,通常情况下,一个程序的主窗体明显的决定了这个程序的轮廓,许多程序的设计技巧视觉上与主窗体的关联很大,而且,不同程序的主窗体通常不同;
二、 文档类型的设计,一个MFC程序通常仅包含有限个文档类型,这一点明显的是一个缺陷,而且MFC的文档设计同样缺乏RAD机制;
三、 通常情况下,基于MFC的程序仅支持有限个CView的派生对象,这一点不仅极大地限制了程序的表现力,同样也限制了程序功能的内涵、外延;
四、 二次开发机制,缺乏二次开发机制是基于MFC的软件的致命硬伤;
五、 通常情况下默认的MFC程序缺乏灵活、强大的扩展机制,部分基于MFC的程序存在的扩展机制取决于开发者的技巧;
六、 广泛的组件连接机制,这一点是绝大多数MFC程序所不具备的;
七、 内置的用户化的可视化设计机制;
Tangram框架的宗旨就是针对上述问题设计的,一个基于Tangram的MFC程序可以具备以下几个基本特征:
一、一个内置的可视化设计引擎,这个引擎可以设计你的程序的主窗口,根据不同的需求,你可以为你的系统配置完全不同的个性化主窗口;
二、允许你的程序包含任意多个MFC意义下的文档模板,你可以以所见即所得的方式设计每一个模板;
三、允许你的程序支持任意多个CView派生对象,并保存对应View的数据;
四、允许你的程序连接任意ActiveX控件以及.NET Control,允许用户、程序员用CView派生对象、ActiveX控件以及.NET Control设计任意复杂的文档模板;
五、允许你的程序具有类似MS Visual Studio Tools for Office一样的二次开发机制;
六、允许你的程序自然的集成Microsoft Visual Basic for Application;
七、使得你的程序具备类似IBM eclipse模式的Plug in扩展机制;
八、使你的程序自然得成为一个超级浏览器;
Tangram与“公共组件空间”
在通常情况下,一个具体的程序需求要么已经存在某类满足条件的功能组件,要么经过适当的解析可以表现为某类合适的开发工具适宜的开发对象,例如,一个数据库界面用VB6、VB.net、Delphi往往易于上手,而富于表现力的HTML适合于构造有感染力的界面,C++则是高手施展才华的领地,一个程序员面对的一个有趣的问题是:能否综合利用已存在的开发工具的长处以及已经存在的组件来完成某些需求的细节部分,然后用C++的手段将各开发工具完成的部分进行整合?
(一个基于Tangram框架的MFC软件中软件界面的分工,图中显示二个Form是基于VB设计的,一个View是CFormView的派生对象)
在Tangram框架下,我们定义了一个被称为“公共组件空间”的一个软件组件集合:我们将ActiveX控件、ActiveX Document、.NET Control以及满足很弱条件的CView派生对象形成的软件组件集合称为“公共组件空间”的“基”,在这个基中取有限个元素(可重复)形成一个有限元素的组,所有这类的有限元素组形成的集合称为“公共组件空间”,由于“公共组件空间”包含的元素是有限维的软件组件组,因此每一个这样的有限维的软件组件组可以对应一个或多个MFC意义下的文档(如果为每个这样的有限维的软件组件组都匹配一个几何布局的话,就形成了一个特定的CFrameWnd),Tangram的基本功能就是使得“公共组件空间”里的每一个元素自然的成为你的基于MFC技术的软件的自然扩展,从这个意义上说,每个基于Tangram的应用程序是对“公共组件空间”中元素的数学表示。
Tangram工作原理:
在Visual Studio .NET中,我们提供了基于Microsoft技术的Wizard为开发者生成基于Tangram框架的MFC代码:
编译后,将生成一个空白的主窗口,如果您需要一个个性化的主窗口,可以选择“New Work Space”,您将得到一个设计界面:
(空白主窗口)
在左侧的工具箱中有SplitterWnd、Tab Style Window设计工具,您可以设计您的窗口样式:
(设计阶段的MDI主窗口)
一个具体的主窗口对应一个WorkSpace文件,一个基于Tangram的MFC程序可以有任意多个主窗口,一个具体的运行时形态依据一个配置文件(一个XML文件),以便指定一个特定的主窗口以及其它运行时信息,一个典型的配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;usercontrol;component;doctemplate"/>
</assemblyBinding>
</runtime>
<Tangram
MainFrameID = "DocumentServer.AppObj"
MainFrameClientID = "DocumentServer.TabedMDIComponent"
DocServerID = "DocumentServer.Documents"
CtrlBarComponentID="DocumentServer.ControlBar"
EnableVBA = "false"
VBAComponentID = "TangramVBAComponent.TangramVBAHost"
SkinComponentID = "TangramSkinManager.SkinServera"
DocViewID="DocumentServer.DocViewConnector"
ActiveXObjID="TangramActiveXServer.ActiveXObj.1"
AppGUID = " 5F8CF6E1-5BF8-4ff8-A33D-BDD9DA6D3CEC">
<WorkSpace>TangramApp1.app</WorkSpace>
<RegistryKey>Sunhui</RegistryKey>
<StdProfileSettings>4</StdProfileSettings>
<Skin>MyXPPro/MyXPPro.uis</Skin>
<BackgroundType>html</BackgroundType>
<BackgroundFile>background.htm</BackgroundFile>
<Caption>Welcome to the World of Tangram!</Caption>
</Tangram>
</configuration>
如果您熟悉.NET程序部署,可以看出这就是.NET程序的默认配置文件,<WorkSpace>TangramApp1.app</WorkSpace>指定主窗口。Tangram允许您设计出您能想象得出的绝大多数类型的主窗口以及作为文档窗口框架的Frame窗口,从这个上讲,Tangram为您的系统提供充分的“软性”。任何一个基于Tangram的软件系统都包含一个模板管理机制,在任何时候,用户或者开发者均可设计新的程序模板:
(设计新的模板)
(按设计的模版产生新文档)
Tangram提供文档复合技术文档内嵌套子文档机制,使得用户及开发者可以设计功能综合、复杂的文档(类似HTML页面的frame机制)。
Tangram与二次开发:
通过一个扩展插件,Tangram提供一步到位的VBA集成机制:在一个特定的配置文件中,通过指定EnableVBA = "true",可以使得一个运行时态支持VBA集成,此时每个Tangram意义下的文档自然生成一个VBA工程:
(Tangram通过插件技术为每个文档生成一个VBA工程)
此外Tangram提供VBA之外的二次开发机制。Tangram的后续版本将支持更多的二次开发引擎与描述引擎(包括XAML)
Tangram与程序个性化:
Tangram为用户提供充分的个性定制功能,开发者可以为特定的系统提供基于Flash的Splash,允许用户将HTML、Flash集成到程序中并与程序指令充分交互作用,例如,用户可以为MDI程序提供HTML背景或Flash背景以增强程序的感染力,用户可以在已有的系统中增加自己的界面元素以及进一步集成新的功能单元,特别,我们提供插件使得用户可以连接StarDock的皮肤引擎。
Tangram组件与Plug in:
通过扩展插件,一个基于Tangram的MFC程序可以在其模板中使用绝大多数的ActiveX控件以及.NET Control,因此,基于VB6开发的ActiveX Ctrl/ActiveX Document均可作为Tangram插件,基于.NET FrameWork开发的任何控件也可以作为Tangram插件。在Tangram框架中,我们提供基于ATL以及Managed C++的MFC View向导为开发者提供C++插件开发机制。Tangram提供Tab Style风格窗口扩展插件开发机制,使得理论上,基于Tangram的MFC软件可以支持任意风格的Tabbed窗口。通过我们提供的插件机制,开发者可以实现业务与界面的分离。
Tangram与.NET FrameWork 开发:
Tangram提供一个超级控件,使得基于Tangram开发的文档可以作为其它.NET程序的一个Form或.NET 控件:
(Tangram文档用于C#程序开发)
(Tangram技术用于实现C#程序的主窗口)
Tangram与通用文档设计引擎:
Tangram本质上提供了一个通用的文档构造引擎,从这个意义上说Tangram提供了应用程序级别的MFC可视化设计机制,极大地方便了应用程序文档的构造,事实上,一个基于Tangram的系统的每一个主窗口同样被实现为一个可以被一个编辑器设计的文档,通过Tangram框架,我们向应用程序文档化的方向迈出了有意义的一步。
Tangram与B/S开发:
Tangram通过插件机制自然宿主IE内核,因此是一个扩展的浏览器,特别,我们提供HTML模型的扩张,使得HTML脚本可以自然、直接执行Tangram程序的对象指令,基于Tangram的MFC程序可以成为具有B/S、C/S双重特征的应用系统。
Tangram与Java
通过第三方插件,基于Tangram的软件可以支持基于Java的二次开发,特别可以将JFrame对象直接显示为一个C++的View
Tangram的未来
我们希望Tangram能够发展成基于Microsoft技术平台上类似IBM Eclipse类型的集成应用框架,为此,我们还有很长的路……
其他文章:
Tangram与软件的组合构造
软件柔性
使用Tangram构造你自己的软件开发平台(一)(参见我的Blog)
Tangram 截图(一)
Tangram运行时截图-2
Tangram下载:http://www.apptemplate.com/opencn/downloads.asp
技术支持:http://www.apptemplate.com/opencn
技术支持论坛:http://www.apptemplate.com/opencn/MsgBoard/default.asp
联系方式:[email protected]。