TangramLite介紹

經過一段緊張的忙碌,TangramLite的第一個測試版本終於出爐了你可以在https://sourceforge.net/projects/tangramlite中下載源代碼,TangramLite最初的定位是給團隊裏的年輕人提供一個學習Tangram框架開發思路的內部教材,基本工作在20048月份完成,以後一直閒置在機器裏,也許是一個思路上的盲點,我近兩年來一直沒有真正認真考慮過這個東西的命運。兩個月前,當我找到這個東西的備份時,有一種說不清楚的感覺,大體是:這些年來一直在埋頭工作,卻很少想給每個工作一個很具體的着落,同時也對這個框架感到陌生了,許多當初的構思已經記不清楚了……。TangramLite的原始框架是基於Visual Studio 2003中的C++框架開發的,關鍵的部分用ATL/MFC/Managed C++代碼混合寫成,可以支持Microsoft Visual Basic for Application集成。伴隨着對關鍵代碼的逐步解釋,我逐漸意識到,這個框架還是具有一定實用價值的,因此,在團隊裏其他人熟悉這個框架的過程中,我有意識的將這個東西系統化,使之能夠成爲一個使多人受益的輕量級別的開發框架。

用什麼樣的思路介紹Tangram系列構思,是一個令我頭痛多年的問題,我的許多朋友,包括CSDN的蔣濤、孟巖、袁德俊等都有許多不同的感受,這些技術出身的朋友,反饋中有許多微妙的差別。TangramLite裏面包含Tangram的一些關鍵的構思,技術路徑差別很大,也許更適合現在的開發者,因此,希望能夠從這裏找到一個思路上的突破。

TangramLite能做什麼?同樣也是一個不易表達的問題,因此從什麼地方找介紹點,是這兩個月煞費苦心的難點,最終,還是選擇了從MicrosoftInternet Explorer作爲出發點。經過多番改進,TangramLite已經從最初的在VS2003上的工作移植到Visual Studio 2005上,截止到2006818日,已經完成了COM框架上的絕大多數工作,計劃9月完成.NET框架下的開發工作。最終我們決定將這個框架的大部分工作作爲一個基於GPL協議的開源項目,沒有開源的部分,例如:Microsoft VBA相關的部分,由於與GPL協議相悖,故將來打算作爲非開源性質的工作進行商業化。

TangramLite的出發點是從MFC的文檔視圖框架開始的,Document/View框架,是MFC類庫最重要的特徵之一,也是MFC框架最有爭議的地方,傳統的MFC框架的關鍵部分對Document/View框架的依賴性是衆所周知的,這部分內容成就了MFC今天的地位,然而這部分工作,太“MFC”化了,以至於除了MFC系列應用之外,基本上對其他應用開發(例如VBDelphi.NET等等)幾乎是毫無用處,此外,傳統的MFC框架,特別是MDI框架由於關聯於一個文檔模板隊列,使得軟件的表現力大大的受到侷限,TangramLite的基本技術出發點就定位在這裏。

爲什麼許多MFC框架裏的好的技術無法運用到VBDelphi等開發環境之中?許多軟件應用,在MFC框架中自然的可以被表示成一個文檔,然而,更多時候,有用的文檔卻無法自然的體現爲一個控件,這是MFC框架的一個不足,如果有一種辦法,可以使得基於MFC開發的文檔在另一個場合下能夠體現爲一個控件、.NET控件或IE插件,問題不就迎刃而解了嗎?簡單的說,TangramLite的核心構思就在這裏。如圖所示,幾個MFC文檔作爲IE插件的情況:

在傳統的MFC開發中,每個軟件都有一個主窗口,典型的情況是一個經典的CMainFrame對象,之所以經典,是因爲10幾年來,這個名字幾乎沒有改變,這個對象,是MFC程序運行時的一個具體的可見表示,兩個不同程序,體現爲兩個幾乎完全不同的主框架窗口。有時如果需要整合這兩個程序,由於主窗口分屬不同的進程,因此,我們不得不尋求其他的解決辦法。我們的問題是,有沒有更好的開發辦法,使得表示一個具體、局部應用的主框架窗口可以在運行時以某種方式自然的體現爲另一個窗口(例如VB開發的窗口)的一個組成部分?我們的想法是設法使得主窗口與對應的應用程序的EXE文件實現分離,即在一個Dll中實現主窗口,然後讓exe文件運行時與關聯的主窗口對接,這樣,傳統的EXE文件僅僅是選擇一個針對一個特定主窗口而言的加載方式,只要合理的進行構造,其他應用系統,例如IE、基於VBDelphi等開發的應用系統以及C++開發的系統,均可以以自己的方式在關聯進程中加載對應的主框架窗口,這一設想決定了TangramLite的一個基本策略是實現主框架窗口與特定exe文件進行剝離,這樣在適當的時候,該主窗口可以被其他宿主系統(例如IE)自然接納。基於同樣的道理,每一個具體的文檔類型也可以與特定的應用系統實現分離,分離後的文檔模板,可以形成一個龐大的公共組件集合,同樣可以被其他宿主系統(例如VBDelphiMFCIE等等)動態加載、應用。這樣,我們就形成了對TangramLite的基本動機的描述:實現一個特定MFC軟件系統的exeMainFrameDocument/View3個層次的自然分離,使得一個特定的exe可以選擇一個加載MainFrameDocument/View模板的方式。

TangramLite的應用程序是用特定的Wizard生成的,從結構上看,這類程序幾乎是最小的,除了一個派生的CWinApp對象之外,你基本上看不到其他對象,這個對象重載了CWinApp類的函數,可以使得將來與Microsoft Visual Basic for Application自然對接。在框架內部,作爲一個功能入口點,該對象作了必要的初始化工作,同時也作了其他工作,例如負責加載一個基於Flash動畫的Splash

(基於Flash的動感啓動界面)

以及初始化一個個性化的MDI客戶區背景(可以用HTMLFlash等對象作爲一個個性化背景)。如果打算生成一個應用程序,只需在Visual Studio 2005 IDE中使用TangramLite提供的Wizard,你就可以直接得到一個應用程序框架:

TangramLite中,幾乎所有的東西都有對應的Wizard,在今後的工作中,我們會提供更多的代碼嚮導。

根據Microsoft.NET框架的構想,每個應用程序都會有一個配置文件,這個文件相當於局部的註冊表,文件名爲:App.exe.config,這裏,App.exe爲對應的可執行文件名稱,這個文件是一個xml文件。在TangramLite框架中,這個文件十分重要,TangramLite可執行文件需要根據這個配置文件定位運行時的框架窗口,一個用於TangramLite框架的框架窗口與常規的MFC框架窗口幾乎沒有區別,之所以在一個組件庫裏實現這個對象是因爲適當的時候,我們希望該對象能夠體現爲一個控件或插件,這一點與傳統的MFC框架有相當大的差別,用TangramLite提供的Wizard,你可以直接生成一個MFC/ATL庫,裏面包含主框架的基本實現,便以後,需要在應用系統的配置文件中指定這個框架窗口的ID值,一個典型的配置文件如下:

<?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

              MainAppType = "com"

              MainAssemblyLib = "TangramLiteMainFrameExD"

              MainAssemblyCategory= "TangramLiteMainFrameExD"

              MainFrameAssembly = "TangramLiteMainFrameExD.Application.1"

              ExternalAppAssembly = ""

              VBAComponent= ""

              DotNetComponent = ""

              WorkSpaceGUID = "{9905F281-9C5D-440b-89AF-EE61D3FA548A}"

       >

              <Caption>Welcome To Tangram World!</Caption>

              <WorkSpace>TangramLiteMainFrameD.App</WorkSpace>

              <BackgroundType>html</BackgroundType>

              <BackgroundFile>Background.htm</BackgroundFile>

              <RegistryKey>TangramLiteMainFrameEx</RegistryKey>

              <StdProfileSettings>4</StdProfileSettings>

              <RunModel></RunModel>

              <Skin>Merlin ENI/Merlin ENI.uis</Skin>

       </Tangram>

</configuration>

其中“MainFrameAssembly = "TangramLiteMainFrameExD.Application.1"”用來指定主框架對象,這裏,"TangramLiteMainFrameExD.Application.1"是主框架對象關聯的ATL對象的ID值,配置文件中,MainAppType = "com"表明該應用系統是基於COM框架的,MainAssemblyCategory= "TangramLiteMainFrameExD"指定一個目錄,這個目錄在“x:/program files/Tangramuniversedocument/your company/app name”之中,這裏,“your company”在應用程序的CwinApp對象在初始化過程中指定,“app name”是應用程序名稱,每個基於TangramLite框架的應用系統都需要一個這樣的目錄,以便保存相關的信息,例如,應用系統的文檔模板信息,就是保存在這個目錄的DocumentTemplate文件夾中,具體的細節請考察“x:/program files/Tangramuniversedocument”的結構,我們會提供相關的文檔對配置文件進行詳細的解釋。

基於同樣的考慮,每個常規的文檔/視圖結構也是由MFC/ATL組件庫實現的,我們也提供了相關的Wizard,每個文檔模板需要一個xml文件進行配置,這些xml文件包存在“x:/program files/Tangramuniversedocument/your company/ app name /MainAssemblyLibcategory/ DocumentTemplate”之中,一個典型的文檔模板配置如下:

<?xml version="1.0" encoding="utf-8" ?>

<Tangram

      DocViewID="TangramLiteForm.DocTemplate.1"

      DocObjID = ""

      ExtDocObjID = "TangramLiteFormExtender.docextender.1">

</Tangram>

其中,DocViewID指定文檔模板對應的ATL對象,ExtDocObjID用來指定文檔的Extender對象。一旦你生成一個文檔模板對象,只要寫出對應的xml配置文件,並複製到指定的目錄,任何一個TangramLite開發的應用系統都可以打開、創建對應的文檔。

關於IE擴展,在TangramLite框架中,提供了3Wizard用來實現IEExplorerBar,你可以用這些Wizard生成自己的IE ExplorerBar,我們提供了若干例子,關於如何配置自己的IE ExplorerBar,清參考“x:/program files/Tangramuniversedocument/TangramLiteExplorerBarD”文件夾的目錄結構以及其中的xml文件,這些文件包存在VbandHband文件夾中。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章