其間寫過2篇這方面的文章,基于vc6實現(xiàn),繞彎很大。在vc7.1、vc8里面要簡單很多,主要是把幾個以前為公開的類公開了,最重要的是在CWnd里面加入了一個虛函數(shù)CreateControlSite使得有機會改變控件站點以修改控件行為。在mfc類層次上,CHTMLView和CDHtmlDialog為開發(fā)者提供了創(chuàng)建webgui的一系列基礎(chǔ)設(shè)施,包括事件機制、窗口行為、以及對html文檔操縱接口。我們在此基礎(chǔ)上實現(xiàn)webgui很簡單,然而仍然困惑我很久,經(jīng)理也催過我?guī)状挝乙恢蔽纯蠜Q定最終方案。在我腦袋里一直琢磨是要應(yīng)用程序完全操縱html文檔,還是html訪問應(yīng)用獲取信息,其實就是它們之間的通信模式。一直到昨天我才定下方案,應(yīng)用通過IWebBrowser2接口操縱html元素,html通過vbscript、javascript腳本響應(yīng)本身事件,訪問應(yīng)用。主要是考慮通信自然暢通,而以前我一味想通過應(yīng)用指令完全控制html元素,導(dǎo)致去解析html文檔,費力不討好。下面開始我的想法:
寫一個dll,封裝CDHtmlDialog,提供一個類似html容器的對話框,功能就是加載html網(wǎng)頁,以及創(chuàng)建與html呼應(yīng)的com組件。它本身不包含與應(yīng)用功能有關(guān)代碼,應(yīng)用有關(guān)的部分是html頁面和對于的com功能組件。這里需要對CDHtmlDialog進行了適當(dāng)?shù)母脑煲赃m合自己的目標(biāo):
首先從CDHtmlDialog派生一個類CHTMLContainerDlg,默認情況下會生成一個網(wǎng)頁資源,這個網(wǎng)頁是這個對話框創(chuàng)建時加載的,我們需要的其實是一個容器而不是一個具體的對話框,所以刪除網(wǎng)頁資源,修改對話框頭文件:



















這樣就可以加載html網(wǎng)頁,但是html頁面里面的元素風(fēng)格卻是2k風(fēng)格(至少在ie7以下版本是如此),這個怕是沒起到一點美觀作用,為之我考慮了半天,問過做web的人是否有辦法,最終還是靈感光臨,誤撞上了。重載GetHostInfo函數(shù):





下面就可以演示了,在vs2005里面找個向?qū)韘how一下:










對話框標(biāo)題其實可以通過解析html文檔獲取title標(biāo)題設(shè)置,目前還未處理。下面看看html與應(yīng)用交互的組件。
生成一個atl工程,TestWebCom,添加一個com組件WebComCtrl,添加方法處理上面那個帶...的按鈕(文件夾瀏覽按鈕):










這里不作具體處理,只是象征性彈出一個對話框。好了,上面我們在對話框里面已經(jīng)設(shè)置了com組件的progid,這里可以把html和組件關(guān)聯(lián)上了,通過腳本可以訪問com組件方法:








這個很惱人,用戶可沒有耐心忍受每次多彈出這個對話框詢問組件是否安全。我開始打算將組件實現(xiàn)安全接口解決掉此問題,不過不知道緣何,沒有成功,網(wǎng)上搜索一下好像說在ie7里面無效,沒辦法還是看mfc源碼來解決問題。
CDHtmlDialog類獲取external代碼如下:

























這下就好了,按下網(wǎng)頁選擇文件夾按鈕,彈出對話框:
一套流程完備,方案個人覺得不錯,各司其職,通信自然暢通,一個html配對一個com功能組件,功能組件化不僅使代碼封裝性好,而且可以用于多種語言。
由于此技術(shù)不用于公司開發(fā),今整理提供下載