DirectUI和無窗口用戶界面

DirectUI/DirectUser是一個用戶界面框架(http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.automationelementinformation.frameworkid.aspx)。用Spy++可以在MSN Messenger、Windows XP、Office、IE和Windows Media Player中看到窗口類名字是DirectUIHWND的窗口。

 

從文件描述來看,DUI70.dll和DUser.dll看起來是這個框架的實現文件,而沒有導入這些DLL的軟件應該是複製了這個庫的代碼。舉例來說,Windows Vista和IE7的測試版的IEFrame.dll導入了DUser.dll(http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/6b801577-1699-4093-8a58-198c64b120e0)而正式版使用IEUI.DLL。這應該是微軟不願意公開支持這個功能變化頻繁的類庫,而反壟斷案禁止非Windows組件調用未公開Windows API的緣故。

 

 

再看看DUser.dll的函數導出表(http://www.webtropy.com/articles/dll-api.aspx?dll=duser),可以看到Gadget這個詞被廣泛使用,而沒有具體的控件。因爲沒有窗口句柄,所以控件不是用的窗口類來區分,而是可能和Windows Vista Sidebar Gadgets一樣採用HTML做接口根據Office Communicator的資源來看,是使用XML做接口。

 

從這個類庫的名字和行爲來看,實際上應該是基於DirectX,和WPF類似的界面類庫框架。在微軟的招聘網站上可以看到Office Communications項目組的一個職位的介紹中描述說“Native Win32/64 UX experience via DirectUI, and Web UX experience via Silverlight”,說明這個項目組把它和Silverlight同等對待。DirectUIHWND窗口可以在需要性能和安全性的場合看到,例如IE的Tab窗口、Shell中的DefView、Windows登錄界面等等。在Windows Vista上使用DirectUI的微軟程序和WPF程序一樣兼容Desktop Composition和遠程桌面,應該是直接或者間接調用的Direct3D。

 

那麼我們怎麼做到類似的效果?

 

無窗口模式的用戶界面並不是一個新的概念(http://blogs.msdn.com/oldnewthing/archive/2005/02/11/371042.aspx),Visual C++的應用程序嚮導就可以創建無窗口ActiveX。但是做過無窗口模式的RichEdit的實現的人都知道,微軟的系統控件集中了各種各樣的功能,比如各種快捷鍵、滾動條、界面風格、Accessibility、用戶界面自動化等等,要像IE項目組那樣幾乎完全實現無窗口並不容易。Raymond Chen在http://blogs.msdn.com/oldnewthing/archive/2005/02/11/371042.aspx提到可以使用DrawThemeBackground和DrawFrameControl這兩個API,不過這隻對和Windows界面風格一致的程序有用。要是界面不復雜的話,可以簡單的集成IE的Trident引擎,比如使用MFC的CHTMLView和CDHTMLDialog,以及Windows Forms的WebBrowser類。這樣做的代價就是程序需要犧牲性能和可能在嚴格的IE安全性配置下無法工作,Visual Studio.Net開始的各種嚮導、Google Task、Microsoft Outlook、Outlook Express等就是使用的這種方案。

 

另外一個方案就是集成WPF或者Silverlight。VC項目組在用戶調查中發現,需要使用WPF的Visual C++用戶大都用C#編寫WPF代碼再用C++/CLI和非託管代碼做接口(http://social.msdn.microsoft.com/forums/en-US/wpf/thread/dd1e31bb-feb4-4d77-b524-42a282f519b1/),所以他們決定致力於改進更多用戶使用的功能,例如編輯器的智能感知,而不提供對WPF的支持。Visual Studio 2010就是使用這種方案。

 

爲什麼不能使用未公開的API?如果要看驚恐故事的話,可以參考http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspxhttp://blogs.technet.com/stefan_gossner/archive/2005/07/27/undocumented_API_Part1.aspx

 

題後話:

*如果微軟在產品文檔中討論未公開的API,那麼API還是未公開的嗎?(http://msdn.microsoft.com/en-us/library/aa140182(office.10).aspx

*Visual Studio代碼畫廊中有個叫作DirectUI的類庫,設計思想和微軟的DirectUser庫類似(http://visualstudiogallery.msdn.microsoft.com/en-us/1B69C9FE-E422-4799-9EB5-6AC7034C52E1),不過也有人誤認爲這就是微軟用來實現MSN的界面的庫。

*IE9將會使用Dierct2D作爲渲染引擎,不知道IE項目組在移植完代碼之後是否能把控件類庫的接口公開。從VC項目組徵求下一個版本意見的問題(http://www.surveymonkey.com/s/HDQWGJR)來看,微軟也有意開發利用GPU的類庫。

 

 

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