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



















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





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










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










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








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

























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