【轉】使用DirectUI技術實現QQ界面

轉自http://bbs.csdn.net/topics/350023031javascript

一.介紹

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 // 我的開發的,比較簡單。沒設計工具。css

 

看文章什麼的時候必定要看評論喲,,,java

評論什麼都是精華c++

 

幾乎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。
程序員

相關文章
相關標籤/搜索