亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VC編程技巧:IE控件的高級用法

2019-11-17 05:07:13
字體:
來源:轉載
供稿:網友
  一、如何顯示內存中的 Html 網頁

   或者因為網頁保密的考慮;或者因為軟件分發的考慮,有的時候就需要讓 IE 或 IE 瀏覽器控件顯示內存或資源中的 HTML 網頁。在 MFC 中,CHtmlView::LoadFromResource() 可以顯示程序資源中的 HTML 內容。我們都知道MFC的 CHtmlView 其實是對 IWebBrowser2 的一個包裝,但是在 IWebBrowser2 中卻沒有類似的方法。那么它是如何實現的那?步驟如下:

   1、首先通過 IWebBrowser2::Navigate2() 顯示一個網頁,其目的是產生有效的對象,從而得到 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 指針;

   原理性代碼如下:

// 顯示一個空白網頁
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 );

VC編程技巧:IE控件的高級用法
圖一、IE控件顯示內存中的 HTML 文件

VC編程技巧:IE控件的高級用法
圖二、HTML對話窗
   IE 所能支持的數據傳輸協議,除了大家所熟悉的 http、FTP、file......還有一個協議是 res ,它表示瀏覽顯示文件中的 HTML 資源。你可以在 IE 的地址欄上直接輸入這樣格式的 URL:"res://文件名/資源名"。

   把 HTML 文件加入到程序資源的方法比較簡單,在資源卡片中,鼠標右鍵彈出菜單,執行 Import...(引入),選擇指定的 HTML 文件,然后給一個資源名稱即可。(在這里,最方便的資源名稱用字符串比較好,假如使用整數ID,那么將來在使用的時候是這樣的格式:res://文件名/#101,這里假設 101 是資源的ID號。真麻煩!我不太喜歡這樣的方式。)對于圖片文件等其它的附件,則需要手工編輯資源 RC 文件(用 IDE 環境引入,它會試圖用文本方式打開一個2進制文件,多數情況下會“死機”)。下圖是事例程序引入資源后的樣式:


(圖片較大,請拉動滾動條觀看)

圖三、HTML 資源的引入
   手工編輯 RC 文件的部分是:

......
/////////////////////////////////////////////////////////////////////////////
//
// HTML
//

HTML_TOWord       HTML  DISCARDABLE   "res//ToWord.htm" // 這兩個是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 控件的上下文菜單,其實就是需要實現 IDocHostUIHandler 接口中的 ShowContextMenu 方法。假如使用 ATL 編寫程序,我認為實現是比較簡單的(也許是我使用 ATL 寫 COM 比 MFC 熟悉一些的因素吧)。事例程序由于用 MFC 書寫,真是搞的我頭暈眼花,翻箱倒柜終于找到了微軟書寫的演示代碼,于是我就直接復制過來使用了。(換句話說,讀者在閱讀這部分代碼的時候,假如有問題可不要問我。你直接打電話去咨詢 Microsoft 哈。)

   三、擴展 HTML 腳本中的 external 對象

   從 CCmdTarget 派生一個自動化對象(新建C++類的時候,注重別忘了選擇 Automation)。在這個類里,你可以使用 ClassWizard 的 Automation 卡片,添加自定義的方法和屬性。而在 HTML 的腳本程序中,就可以使用 window.external 進行調用了。用這個方法,實現了對 HTML 腳本功能的擴充。在 HTML 腳本和自動化對象之間要建立起關系,則需要實現 IDocHostUIHandler::GetExternal() 方法。

   四、顯示 HTML 樣式的對話窗

   這節內容是本文的重點。

   用戶的界面設計經歷了若干個發展階段。最早的程序設計,可以說沒有用戶界面;然后發展出一些簡單的與用戶交互的界面(控制臺界面,全屏文本界面);再然后發展出了圖形界面。其實我們現在的商業程序設計中,界面的處理代碼占用了很大的篇幅。為了使界面的處理變得簡單、通用、易修改維護,人們制作了很多的界面程序庫。說實在話,大多數的界面程序庫由于封裝的不好,一是不靈活,二是經常需要修改它內部的 BUG,重用的效果并不理想。通用的換膚軟件也只能實現對標準的窗口類進行皮膚美化,對自定義的窗口類還是需要自己寫鉤子。

   現在,我們已經有一個非常好的方法進行界面設計了,那就是使用 HTML(使用 Visual Studio.net 的程序員,一定對 .net 的界面很喜歡吧?!.net 開發環境,無處不在使用 HTML 方式的界面)。即使是一個完全地道的本地軟件(非B/S軟件),也可以使用本地 asp 方式,HTA 方式進行程序設計。軟件用戶非常喜歡這樣的程序,因為他早就熟悉并把握了瀏覽器的操作,另外,對于程序員來說,也非常喜歡這種方式,因為不會再為換膚,不同用戶不同的界面特化而傷腦筋了。

   微軟將要在下一代的程序設計中使用 xml 來描述用戶界面。這種設計方式將會解放你、我這樣的程序員,把咱們的工作量全部都轉化到美工師那里去了:) 借 vckbase 的平臺,現在呼吁大家,盡快學習和把握 HTML、XML 的設計和腳本編程,并能熟練地對它們與 C++ 對象的交互進行編程??梢灶A計在未來的兩三年內,擁有這樣水平的程序員,一定會開始吃香餑餑了,嘿嘿......

   下面,就如何顯示一個 HTML 對話窗,開始我們未來軟件方式的編程吧。

   我們要調用 MSHTML.DLL 中的一個函數 ShowHTMLDialog(Ex) 來完成 HTML 對話窗的顯示和數據交互。這個函數的聲明是:

HRESULT ShowHTMLDialogEx(     HWND hwndParent,
   IMoniker *pMk,
   DWORD dwDialogFlags,
   VARIANT *pvarArgIn,
   WCHAR *pchOptions,
   VARIANT *pvarArgOut
);

   hwndParent 對話窗的父窗口句柄 這個太簡單了,不多羅嗦。

   pMk URL的命名接口指針 表示在對話窗中顯示哪個URL的頁面。但它不是以簡單的URL字符串方式提供的。它使用了moniker(命名)接口指針。 根據URL得到IMoniker *很簡單,調用CreateURLMoniker()。唯一要注重的是,這個函數需要連接 Urlmon.lib 庫。

dwDialogFlags 對話窗類型 可以組合 HTMLDLG_NOUI、HTMLDLG_MODAL、HTMLDLG_MODELESS、HTMLDLG_PRINT_TEMPLATE、HTMLDLG_VERIFY。
示例程序使用的是模式對話窗。HTMLDLG_NOUI 在下一節中介紹。

   pvarArgIn 對話窗的輸入參數 一個傳入對話窗的VARIANT變量,對話窗腳本中使用 window.dialogArguments 可以取得。

   pchOptions 對話窗樣式 用字符串表示的對話窗樣式。參考 IHTMLWindow2::showModalDialog()函數。

   比如:"dialogHeight:100px dialogWidth:200px"表示200點寬,100點高。假如你不想在程序中指定,也可以在HTML中描述。

   pvarArgOut 對話窗輸出參數 對話窗的VARIANT返回值,對話窗腳本中使用 window.returnValue 可以賦值。

   這個函數在 vc.net 的頭文件上有完整的聲明,假如你使用 vc 6.0 的話,那么函數聲明、函數指針定義和一些常量,你需要手工添加。還好,本文的示例程序是在 VC6 下編寫和調試的,下載代碼后,請仔細閱讀源文件和注釋就可以了。

   五、執行 HTML 腳本

   關于調用腳本的方法,我在 vckbase 發表了好幾篇文章(鬼知道我為什么對腳本這么有愛好)。ShowHTMLDialogEx()函數中,假如類型參數給出 HTMLDLG_NOUI,則表示并不真正顯示一個對話窗,而是加載指定的 HTML 并執行其中的腳本。示例程序的該腳本中,執行一連串的動作,完成了把上一個 HTML 對話窗中用戶輸入的文本,發送到 MS WORD 中去。以此上下串聯起來,演示了本文章中所討論的所有功能。下面我把腳本和注釋給朋友們展現一下:

On Error Resume Next
Set wordapp=CreateObject("Word.application") ''''運行 MS WORD
if err<>0 then
MsgBox("沒有安裝 MS WORD")
else
wordapp.visible = true ''''顯示WORD界面
wordapp.Documents.Add "",false, 0 ''''新增一個空文檔
wordapp.Selection.TypeText window.dialogArguments ''''鍵入傳遞進來的文本
end if
window.close '''' 關閉
更多文章 更多內容請看瀏覽器使用技巧專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久中文字幕久久av| 国产精品久久久久久婷婷天堂| 欧美黑人巨大精品一区二区| 国产精品日韩在线观看| 欧美电影在线观看| 国产精品视频网| 尤物yw午夜国产精品视频| 欧美激情免费观看| 久久久久久亚洲精品不卡| 欧美激情综合亚洲一二区| 日韩欧美黄色动漫| 久久精品久久久久久国产 免费| 久久人人爽人人爽人人片av高请| 亚洲精品一区二区网址| 国语自产偷拍精品视频偷| 色噜噜狠狠狠综合曰曰曰88av| 国产精品极品美女在线观看免费| 欧美黄色片免费观看| 日韩视频在线观看免费| 亚洲天堂一区二区三区| 久久69精品久久久久久国产越南| 欧美成人免费一级人片100| 国产精品美女视频网站| 亚洲欧美激情四射在线日| 国产黑人绿帽在线第一区| 国产精品电影网| 伊人久久免费视频| 爽爽爽爽爽爽爽成人免费观看| 美女av一区二区三区| 日韩高清电影免费观看完整版| 成人免费大片黄在线播放| 日本精品va在线观看| 久久久免费高清电视剧观看| www.亚洲免费视频| 亚洲性视频网站| 中文日韩电影网站| 精品视频9999| 成人h视频在线| 色中色综合影院手机版在线观看| 久色乳综合思思在线视频| 亚洲视频网站在线观看| 亚洲欧美国产日韩中文字幕| 色综合五月天导航| 欧美性xxxx极品hd满灌| 91精品视频免费看| 91久久久久久久一区二区| 欧美wwwxxxx| 91精品国产综合久久香蕉最新版| 久久福利视频导航| 国产国产精品人在线视| 一本一道久久a久久精品逆3p| 成人在线视频网站| 91精品久久久久久久久久| 精品国产乱码久久久久久天美| 欧美黑人巨大精品一区二区| 成人有码在线视频| 国产精品美女网站| 国产丝袜高跟一区| 91精品国产乱码久久久久久久久| 日韩精品高清视频| 亚洲欧美国产va在线影院| 日韩精品999| 久久久久久久久久久91| 4388成人网| 国产日本欧美一区| 色妞在线综合亚洲欧美| 亚洲国产精品久久久| 亚洲性日韩精品一区二区| 亚洲自拍偷拍福利| 97免费在线视频| 久久久国产视频91| 国产精品第七十二页| 欧美亚洲国产视频| 亚洲欧美精品伊人久久| 久久琪琪电影院| 欧美成人免费播放| 欧美专区日韩视频| 亚洲性日韩精品一区二区| 91精品久久久久久久久青青| 久久久久久这里只有精品| 欧美极品少妇与黑人| 国产丝袜高跟一区| 岛国av一区二区在线在线观看| 欧美精品videos另类日本| 国产精品成人一区| 欧美精品久久久久久久免费观看| 日本成人免费在线| 成人激情电影一区二区| 成人网中文字幕| 国产精品扒开腿做爽爽爽的视频| 亚洲一区二区中文| 国产成人精品视频在线观看| 在线视频免费一区二区| 日韩视频永久免费观看| 高清欧美电影在线| 精品国产老师黑色丝袜高跟鞋| 国产日本欧美一区二区三区在线| 性色av一区二区三区红粉影视| 成人天堂噜噜噜| 久久精品国产99国产精品澳门| 曰本色欧美视频在线| 欧美午夜影院在线视频| 91精品久久久久久久久久另类| 亚洲激情视频网站| 91探花福利精品国产自产在线| 亚洲欧美日韩精品| 国产精品免费视频xxxx| xvideos成人免费中文版| 亚洲国语精品自产拍在线观看| 欧美激情性做爰免费视频| 欧美日韩在线免费观看| 日韩av不卡电影| 欧美成人免费一级人片100| 热re91久久精品国99热蜜臀| 成人在线视频网站| 国产成人精品一区二区| 成人性生交大片免费看小说| 午夜精品一区二区三区在线视| 国产成人精品久久久| 国产精品电影在线观看| 成人激情黄色网| 国产伦精品免费视频| 亚洲区bt下载| 久久免费视频网| 欧美精品电影在线| 国产综合久久久久久| 国产一区视频在线| 亚洲精品女av网站| 在线视频亚洲欧美| 亚洲精品欧美一区二区三区| 97在线精品视频| 日韩精品视频在线| 亚洲美女www午夜| 成人黄色免费网站在线观看| 欧美国产日韩免费| 日韩精品视频三区| 亚洲激情视频在线观看| 欧美久久久精品| 奇米一区二区三区四区久久| 亚洲成人久久一区| 精品亚洲一区二区三区在线播放| 国产精品免费在线免费| 精品免费在线观看| 日韩专区中文字幕| 国产成人精品免高潮费视频| 欧美成人午夜影院| 日本欧美一二三区| 亚洲男人天堂古典| 97国产suv精品一区二区62| 日韩国产精品一区| 神马久久久久久| 亚洲精品综合精品自拍| 欧美性xxxx18| 中文字幕欧美国内| 欧美日韩成人精品| 亚洲精品日韩av| 人妖精品videosex性欧美| 91在线中文字幕| 国产精品香蕉在线观看| 91av在线精品| 日韩av电影国产| 日韩欧美精品中文字幕| 日韩av片免费在线观看| 欧美精品www在线观看|