一種全新的軟體介面設計方法(續)
點擊下載文章所附代碼
撰文:Aweay
你可轉載,拷貝,但必須加入作者署名Aweay,如果用於商業目的,必須經過作者同意。
前段時間,筆者寫了一篇關於使用Web頁面設計見面用於Win32應用程式的文章,詳細內容請點擊這裡參考此文。但很可惜很多網友發mail說不知道我寫的是什麼,不就是設計網頁嘛,早都有的技術為什麼說是“全新的”的呢?還有網友提出如何?像網際飛音那樣的自訂協議,比如安裝網際飛音後中瀏覽器會處理dnmp://cmd/15這樣的地址,結果開啟了網際飛音程式,問我能不能也用我文中提到的方法實現?還有什麼WebCatcher://只類的東西,我也忘記了。為此作者決定再一篇續,補充討論一些東西,並試圖解決上面網友的問題,如果您還沒有看過上面文章,建議您先參考一下,其實我認為已經寫的非常清楚了,如果您已經是老讀者了,那我們繼續。
首先我在文中討論到的介面設計技術在國內的軟體中很少見到,在知名軟體中,我也就見過Windows,Visual Studio.Net IDE工具,Norton Anti Virus,Borland C# Builder使用,可是說也是非常少的,雖然鮮有軟體使用這樣的技術設計介面,但我個人認為這是軟體介面設計的一個方向,或者說趨勢吧,所以就試圖去研究這樣的技術,並介紹給大家,如果您還不明白,我用CyberArticle(因為有人問如何?這個軟體的某些部分,我就安裝了,發現挺好用)來說明一下:
這個介面是用於顯示使用者收藏的技術文章,在傳統的介面設計中,我們可以使用ListView32來實現,但這裡使用的InternetExplorer_Server,也就是Web頁面,如果點擊"移動到..."按鈕,就會彈出一個對話方塊(本地代碼),
我們知道在網頁裡是不能直接調用本地代碼的,當然您可以使用COM,但是在我那篇文章裡已非常清楚的說明了為什麼不使用COM,所以這裡也不是使用COM,那麼他怎麼做到的呢?有什麼好處呢?呵呵,這些問題在上面文章裡也有介紹,詳細內容請點擊這裡參考此文。
這就是這種技術,結合網頁表現介面的簡潔,又作到了介面使用的靈活性,還是這個這個軟體,如果我們開啟一個收藏的文章,網頁的串連地址是類似於CyberArticle://15這樣的地址,而不是我們常見的URL地址(這就是別人的問題,問我為什嗎?如何?),點擊這個地址後軟體會開啟一個本地的臨時網頁,裡面是使用者收藏的文章,是不是很神氣呢?如果仔細考慮這個軟體的實現,我想必須這樣做才好。
其實如果仔細看我的上篇文章,關於這個問題是可以解決的,在上篇文章中我們提到IDocHostUIHandler有很多虛擬方法,重載實現後可以定製瀏覽器的功能,在IDocHostUIHandler中有一個虛擬方法:TranslateUrl,這個方法可以給程式員一次自己解析URL地址的機會,這是我們判斷需要解析的URL是否是我們需要的CyberArticle://格式,如果是,取得後面資訊做相應處理,如果不是原樣返回給IE。代碼如下:
virtual HRESULT STDMETHODCALLTYPE TranslateUrl( /* [in] */ DWORD dwTranslate, /* [in] */ OLECHAR __RPC_FAR *pchURLIn, /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut) { String addr=WideString(pchURLIn); if(addr.SubString(1,5)=="siney") { WCHAR* home=L"http://siney.nease.net/index.htm"; WCHAR* soft=L"http://siney.nease.net/myproj/MySoft.htm"; WCHAR* article=L"http://siney.nease.net/dialy.htm"; WCHAR* nd=0; String section=addr.SubString(9,10); if(section=="home/") nd=home; else if (section=="soft/") nd=soft; else if (section=="article/") nd=article; else return S_FALSE; size_t ln=wcslen(nd); *ppchURLOut = (LPOLESTR)CoTaskMemAlloc((ln + 1) * sizeof(WCHAR)); wcscpy(*ppchURLOut, nd); return S_OK; } else return S_FALSE; } |
上面的代碼中,我們處理以siney://前置的協議URL地址類型,其他忽略,為此我們設計這樣的html代碼:
<html> <head> <SCRIPT language="JScript"> function MyFunc() { external.HelloWorld(); } </SCRIPT> </head> <body> <input type="Button" value="Show hello world" onClick="MyFunc();" />點擊按鈕後下面EditBox(本地的)會顯示文字 <br> <a href="siney://home">我的首頁 siney://home</a><br> <a href="siney://soft">我的軟體 siney://soft</a><br> <a href="siney://article">我的文章 siney://article</a><br> </body> </html> |
這樣當瀏覽器裡訪問siney://home這樣地址的時候,就會來到我們首頁地址,同樣上面的html代碼僅限於我們自己的定製瀏覽器可以訪問,如果使用IE開啟這個html檔案,則訪問是失敗的,類似於上篇文章一樣。
到這裡我以為已經解決網友的問題,但我發現網際飛音的dnmp協議類型地址在任何基於IE的瀏覽器都能被準確執行(甚至FireFox也可以,Opera不行),比如:dnmp://45765adsf465a4sdf568a6d7s可能開啟網際飛音播放一首mp3,說明它使用了不同的方法,經過一番研究,我發現它使用了更簡單的方法,就是在註冊表裡註冊一個索引值,類似於註冊一個副檔名一樣,不同的是多了一個URL Protocol,
這樣,只要註冊了相應協議類型的程式,IE就會在必要時把地址作為參數傳遞給註冊的程式處理,這點同樣類似於註冊檔案類型。
到這裡,我們已經解決了全部問題,如果大家還有什麼問題可以多看看MSDN和一些COM相關的東西,如果有什麼想法或者心得也歡迎您與我取得聯絡:siney@yeah.net