IE 控件一些高級使用方法
作者:楊老師
下載源代碼
本文介紹如下內容
1、如何顯示內存中的 HTML 網(wǎng)頁(yè);
2、如何屏蔽掉鼠標右鍵的上下文菜單;
3、如何擴展 HTML 中的腳本(external)對象;
4、如何顯示 HTML 樣式的對話(huà)窗;
5、如何執行 HTML 腳本;
一、如何顯示內存中的 HTML 網(wǎng)頁(yè)
或者因為網(wǎng)頁(yè)保密的考慮;或者因為軟件分發(fā)的考慮,有的時(shí)候就需要讓 IE 或 IE 瀏覽器控件顯示內存或資源中的 HTML 網(wǎng)頁(yè)。在 MFC 中,CHtmlView::LoadFromResource() 可以顯示程序資源中的 HTML 內容。我們都知道MFC的 CHtmlView 其實(shí)是對 IWebBrowser2 的一個(gè)包裝,但是在 IWebBrowser2 中卻沒(méi)有類(lèi)似的方法。那么它是如何實(shí)現的那?步驟如下:
1、首先通過(guò) IWebBrowser2::Navigate2() 顯示一個(gè)網(wǎng)頁(yè),其目的是產(chǎn)生有效的對象,從而得到 IHTMLDocument2 接口;
2、IWebBrowser2::get_Document() 得到 IHTMLDocument2 接口指針;
3、IHTMLDocument2::QueryInterface() 得到 IPersistStreamInit 接口指針;
4、IPersistStreamInit::InitNew() 初始化接口對象;
5、IPersistStreamInit::Load() 裝載內存中的 HTML 數據流(IStream *);
內存指針轉換為流的方法是:
I、 GlobalAlloc() 申請內存;
II、 復制 HTML 字符串內容到上述的內存中;
III、 CreateStreamFromHGlobal() 轉換內存為 IStream 指針;
原理性代碼如下:
// 顯示一個(gè)空白網(wǎng)頁(yè) m_ie.Navigate2( &CComVariant(_T("about:blank")),NULL,NULL,NULL,NULL); // 得到 IHTMLDocument2 指針 CComPtr< IDispatch > spDoc(m_ie.GetDocument()); // 得到 IPersistStreamInit 指針 CComQIPtr< IPersistStreamInit, &IID_IPersistStreamInit > spPSI( spDoc ); // 申請內存,復制 HTML 字符串 LPTSTR lpMem = (LPTSTR)::GlobalAlloc( GPTR, ::lstrlen( lpHtml )+1 ); lstrcpy( lpMem, "xxx xxx" ); // 轉換內存為流對象指針 CComPtr< IStream > spStream; CreateStreamOnHGlobal( lpMem, TRUE, &spStream ); // 初始化后,裝載顯示 spPSI->InitNew(); spPSI->Load( spStream );


......///////////////////////////////////////////////////////////////////////////////// HTML//HTML_TOWORD HTML DISCARDABLE "res\\ToWord.htm" // 這兩個(gè)是HTML文件,可以引入HTML_DLG HTML DISCARDABLE "res\\html_dlg.htm"~SEND_R1_C1.GIF HTML DISCARDABLE "res\\~Send_r1_c1.gif" // 下面的是GIF文件,需要手工加入~SEND_R1_C2.GIF HTML DISCARDABLE "res\\~Send_r1_c2.gif"LOGO.GIF HTML DISCARDABLE "res\\Logo.gif"SEND_R1_C1.GIF HTML DISCARDABLE "res\\Send_r1_c1.gif"SEND_R1_C2.GIF HTML DISCARDABLE "res\\Send_r1_c2.gif"SPACER.GIF HTML DISCARDABLE "res\\spacer.gif"#endif // Chinese (P.R.C.) resources/////////////////////////////////////////////////////////////////////////////......
二、屏蔽 IE 控件的上下文菜單
屏蔽或自定義 IE 控件的上下文菜單,其實(shí)就是需要實(shí)現 IDocHostUIHandler 接口中的 ShowContextMenu 方法。如果使用 ATL 編寫(xiě)程序,我認為實(shí)現是比較簡(jiǎn)單的(也許是我使用 ATL 寫(xiě) COM 比 MFC 熟悉一些的因素吧)。事例程序由于用 MFC 書(shū)寫(xiě),真是搞的我頭暈眼花,翻箱倒柜終于找到了微軟書(shū)寫(xiě)的演示代碼,于是我就直接復制過(guò)來(lái)使用了。(換句話(huà)說(shuō),讀者在閱讀這部分代碼的時(shí)候,如果有問(wèn)題可不要問(wèn)我。你直接打電話(huà)去咨詢(xún) Microsoft 哈。)
三、擴展 HTML 腳本中的 external 對象
從 CCmdTarget 派生一個(gè)自動(dòng)化對象(新建C++類(lèi)的時(shí)候,注意別忘了選擇 Automation)。在這個(gè)類(lèi)里,你可以使用 ClassWizard 的 Automation 卡片,添加自定義的方法和屬性。而在 HTML 的腳本程序中,就可以使用 window.external 進(jìn)行調用了。用這個(gè)方法,實(shí)現了對 HTML 腳本功能的擴充。在 HTML 腳本和自動(dòng)化對象之間要建立起關(guān)系,則需要實(shí)現 IDocHostUIHandler::GetExternal() 方法。
四、顯示 HTML 樣式的對話(huà)窗
這節內容是本文的重點(diǎn)。
用戶(hù)的界面設計經(jīng)歷了若干個(gè)發(fā)展階段。最早的程序設計,可以說(shuō)沒(méi)有用戶(hù)界面;然后發(fā)展出一些簡(jiǎn)單的與用戶(hù)交互的界面(控制臺界面,全屏文本界面);再然后發(fā)展出了圖形界面。其實(shí)我們現在的商業(yè)程序設計中,界面的處理代碼占用了很大的篇幅。為了使界面的處理變得簡(jiǎn)單、通用、易修改維護,人們制作了很多的界面程序庫。說(shuō)實(shí)在話(huà),大多數的界面程序庫由于封裝的不好,一是不靈活,二是經(jīng)常需要修改它內部的 BUG,重用的效果并不理想。通用的換膚軟件也只能實(shí)現對標準的窗口類(lèi)進(jìn)行皮膚美化,對自定義的窗口類(lèi)還是需要自己寫(xiě)鉤子???.....
現在,我們已經(jīng)有一個(gè)非常好的方法進(jìn)行界面設計了,那就是使用 HTML(使用 Visual Studio.net 的程序員,一定對 .net 的界面很喜歡吧?!.net 開(kāi)發(fā)環(huán)境,無(wú)處不在使用 HTML 方式的界面)。即使是一個(gè)完全地道的本地軟件(非B/S軟件),也可以使用本地 ASP 方式,HTA 方式進(jìn)行程序設計。軟件用戶(hù)非常喜歡這樣的程序,因為他早就熟悉并掌握了瀏覽器的操作,另外,對于程序員來(lái)說(shuō),也非常喜歡這種方式,因為不會(huì )再為換膚,不同用戶(hù)不同的界面特化而傷腦筋了。
微軟將要在下一代的程序設計中使用 XML 來(lái)描述用戶(hù)界面。這種設計方式將會(huì )解放你、我這樣的程序員,把咱們的工作量全部都轉化到美工師那里去了:) 借 vckbase 的平臺,現在呼吁大家,盡快學(xué)習和掌握 HTML、XML 的設計和腳本編程,并能熟練地對它們與 C++ 對象的交互進(jìn)行編程??梢灶A計在未來(lái)的兩三年內,擁有這樣水平的程序員,一定會(huì )開(kāi)始吃香餑餑了,嘿嘿......
下面,就如何顯示一個(gè) HTML 對話(huà)窗,開(kāi)始我們未來(lái)軟件方式的編程吧。
我們要調用 MSHTML.DLL 中的一個(gè)函數 ShowHTMLDialog(Ex) 來(lái)完成 HTML 對話(huà)窗的顯示和數據交互。這個(gè)函數的聲明是:
HRESULT ShowHTMLDialogEx(
HWND hwndParent, IMoniker *pMk, DWORD dwDialogFlags, VARIANT *pvarArgIn, WCHAR *pchOptions, VARIANT *pvarArgOut);
| hwndParent | 對話(huà)窗的父窗口句柄 | 這個(gè)太簡(jiǎn)單了,不多羅嗦。 |
| pMk | URL的命名接口指針 | 表示在對話(huà)窗中顯示哪個(gè)URL的頁(yè)面。但它不是以簡(jiǎn)單的URL字符串方式提供的。它使用了moniker(命名)接口指針。 根據URL得到IMoniker *很簡(jiǎn)單,調用CreateURLMoniker()。唯一要注意的是,這個(gè)函數需要連接 Urlmon.lib 庫。 |
| dwDialogFlags | 對話(huà)窗類(lèi)型 | 可以組合 HTMLDLG_NOUI、HTMLDLG_MODAL、HTMLDLG_MODELESS、HTMLDLG_PRINT_TEMPLATE、HTMLDLG_VERIFY。 示例程序使用的是模式對話(huà)窗。HTMLDLG_NOUI 在下一節中介紹。 |
| pvarArgIn | 對話(huà)窗的輸入參數 | 一個(gè)傳入對話(huà)窗的VARIANT變量,對話(huà)窗腳本中使用 window.dialogArguments 可以取得。 |
| pchOptions | 對話(huà)窗樣式 | 用字符串表示的對話(huà)窗樣式。參考 IHTMLWindow2::showModalDialog()函數。 比如:"dialogHeight:100px dialogWidth:200px"表示200點(diǎn)寬,100點(diǎn)高。如果你不想在程序中指定,也可以在HTML中<html style=....>描述。 |
| pvarArgOut | 對話(huà)窗輸出參數 | 對話(huà)窗的VARIANT返回值,對話(huà)窗腳本中使用 window.returnValue 可以賦值。 |
On Error Resume Next Set wordapp=CreateObject("Word.Application") ‘‘‘‘運行 MS WORD if err<>0 then MsgBox("沒(méi)有安裝 MS WORD") else wordapp.visible = true ‘‘‘‘顯示W(wǎng)ORD界面 wordapp.Documents.Add "",false, 0 ‘‘‘‘新增一個(gè)空文檔 wordapp.Selection.TypeText window.dialogArguments ‘‘‘‘鍵入傳遞進(jìn)來(lái)的文本 end if window.close ‘‘‘‘ 關(guān)閉
聯(lián)系客服