轉自http://bbs.csdn.net/topics/350023031
一.介紹
DirectUI技術說白了就是XML配置文件+圖片+JavaScript控制界面。這點與網頁css+圖片+JavaScript十分相似,就是如開發網頁一般開發桌面程序界面,這個開發效率當然大大的提高。將程序員從繁瑣的界面繪制工作中解脫出來,專心開發邏輯代碼。還能大大減少代碼量,因為據統計,傳統MFC程序中,界面代碼大約占總代碼的1/3強!也就是說,這個1/3的代碼都可以由xml+javascript替代!
同理,如果網頁開發時,每個圖片都需要由web程序繪制,你能想象一個網頁的代碼量有多少嗎?
簡直不能想象,而傳統Window程序就是如此!
DirectUI技術最早被用於window xp資源管理器左邊欄,被稱為task folder.而DirectUI被廣為國人所知,還得感謝騰訊公司。QQ2009的界面就是使用DirectUI技術開發的。類似的有微軟的MSN,OCS和百度Hi。最近的Office2007 Ribbon界面,如果使用Spy++查看,可以見到一個名為"NetUI"的窗口,其實這也是微軟內部DirectUI的一個變種。不過無論是微軟,騰訊,還是百度,都使用了DirectUI技術來開發自己的軟件界面,卻不肯將其公開。本文將介紹如何使用DirectUI技術開發一個類似QQ的界面演示程序。
二.背景
與DirectUI最相似的要數微軟最近推出的WPF,其設計思想是相同的。只不過WPF只能運行於托管環境下。window下的C++程序員一直呼吁微軟推出native WPF,也就是非托管的WPF。不過微軟給出的答案是:NO。所以WPF將定位於為.NET戰略服務。使用WPF開發的界面程序,必須帶上龐大的.NET運行環境。不過隨着Window 7的普及,這個狀況會有所改變(window 7繼承了.NET環境)。
不過,我想,如果許多公司的產品都是需要支持Window XP(最少QQ現在還是支持Window 2000),所以WPF不是桌面應用程序界面開發的首選。
三.實現
廢話不多說,先看演示程序的圖片,足夠以假亂真吧?!圖片呢?不知道呀,轉的時候就沒有
在xml文件中也引入了網頁中樣式(style)的概念,style控制着網頁中一個元素的外觀。同理,directui xml文件中的樣式(style)控制着一個控件的外觀。同樣的一個button,使用了不同的style,外觀也不一樣。如下面的代碼及圖片所示。
參照網頁開發中的JavaScript,DirectUI JavaScript可以控制控件的狀態、文本、顯示/隱藏、位置等等屬性。DirectUI JavaScript是基於事件,比如在button1點擊事件中,改變button2的文本。或者button1點擊事件之后,button1就要禁用。像這樣的需求,在界面開發中是比較常見的。
在c++代碼中,剩余的只是界面與程序邏輯的借口。比如,QQ2009中從服務器接收添加用戶的通知,然后操作界面將此用戶顯示出來。如此看來,c++代碼中完全沒有了繪制界面的代碼。
四.后話
DirectUI是個好技術,只是微軟不願將其公開,其中最大的原因是與它的.NET戰略沖突。而由DirectUI技術演變而來的WPF只適用於托管環境。不過,還是有幾個公司或者個人開發了自己的DirectUI界面庫。我知道的,有:
DirectUI.com // 公司開發的。居然連試用版也沒有,要付了錢才給你用。
Bodsoft DirectUI // 公司開發的。有試用版。設計工具不是太強大,還湊合。
UIEasy DirectUI // 個人開發的,比較簡單。沒設計工具。
看文章什么的時候一定要看評論喲,,,
評論什么都是精華
幾乎90%介紹DirectUI的人,都抓不住重點:像界面和邏輯分開、用XML來配置界面,都和DirectUI沒有半點關系。
具體來說:只要界面是用文件來配置,都是界面和邏輯分開,VC的用的是*.rc文件,WPF用的是*.xaml文件、LibUIDK用的是*.ui文件。難道VC的對話框程序就不是界面和邏輯分開嗎?難道必須用xml文件嗎?
DirectUI僅僅是又實現了一遍微軟已經成熟的控件,這樣做有個好處:不受制於微軟相關控件的約束。比如要做一個List控件,它的某些Item也需要用List來表達。如果是用CListCtrl,那么有兩種辦法:在CListCtrl中再創建幾個CListCtrl,用來表示Item。但這有些弊端:一個窗口內子窗口的數量有限、使CListCtrl過於龐大,影響性能。還有一種方法就是,自己寫一個類似於List的東東,來當作Item。這個實現上就有點接近DirecutUI了。如果自己寫的這個List不但可以作為Item,還可以作為父控件,那它就是一個DirecutUI的控件了。
由於不受限於微軟的很多約束,所以自由發揮的余地比較大。但發揮到什么程序,還要看各廠家的實力。所以不是說用DirectUI就一定可以開發QQ、MSN類似的界面,也不是說不用DirectUI就不能開發這樣的界面。它們也是沒有任何關系的。
當然,什么東東都是有利有弊的。當你拋棄微軟,自己開發控件時,有多大的機率能比微軟開發的強?有微軟的穩定?有微軟的兼容性好?還有一個問題是:由於這些控件都是各廠家自己開發的,那么原來mfc程序員需要對這些新的控件進行重新學習。有多少人願意學習一種不通用的技術?
DirectUI還有一個好處:讓自己的界面變得不標准。這要帶來的直接好處是:增加Hack成本。比如想截獲QQ的密碼,如果是標准程序,正常情況下,把一個dll注入到QQ進程,然后拿到Edit的窗口句柄,就可以得到*號密碼。現在用了DirectUI的edit,那么就沒有句柄,也不支持標准CEdit的接口,就不能通過常規方法得到密碼。讓界面變得不標准,也是有利有弊的。如果自己的軟件,希望第三方廠家為自己開發插件,那就最好不要用DirectUI。