天天看點

EVC開發執行個體三:浏覽器視窗

 曾有人問過我關于顯示GIF圖檔的問題。我的回答是要麼使用國外做的專用于顯示GIF圖檔的類,要麼利用IWebBrowser COM元件。我還說過我用它做過自定義的IE。其實微軟提供了CE下IE的源程式,就是利用這個元件來實作IE的各個功能的。我做IE是因為Windows CE自帶的IE在各個方面都不符合我們的要求,于是我在IE源程式的基礎上編寫了符合我們要求的浏覽器。這篇文章并不是要講解如何做浏覽器,而是用IWebBrowser元件來顯示GIF、JPG圖檔,當然也能夠顯示網頁。做浏覽器要比隻顯示圖檔、網頁要複雜的多。

  在Pocket PC下開發的人多數會感到奇怪,不是有HtmlView嗎?怎麼還要自己寫啊。因為微軟為Pocket PC定制的核心包含的SDK中,含有支援網頁浏覽的控件,而在Windows CE.NET中沒有。這就需要自己實作了。在這裡我采用模拟器來試驗。模拟器能通過實際平台就更能通過了。操作基本一樣。

  一、制作帶有IE的核心

  在模拟器下定制一個核心大家應該不會陌生了,以前的文章中我已經講過不止一次了。是以在這裡我會簡略的說明如何定制核心。第一步,選擇"EMULATOR:X86",之後在"Available configuration"中選擇"Internet Appliance"。接着隻選擇"Internet Browser",第五步隻選擇"Internet Browser",第六步去掉所有網絡選項,最後"Done"。編譯前加入環境變量"IMGRAM64",然後選擇"EMULATOR:x86 Win32{WCE emulator} Release",開始編譯。編譯後單擊"Download/Initialize"

  下載下傳核心到模拟器上運作。單擊桌面上的IE快捷圖示,如果IE顯示出來那第一步就成功了。

  二、編寫程式

  這個程式我用EVC單獨編寫編譯。而不在PB下編寫。PB附帶的應用程式向導沒有MFC的選項,不如用EVC編寫友善,編譯後再将程式複制到核心目錄下,通過PB來運作。

  編寫程式我也不會過于詳細的講解,隻講解相關的代碼。調出EVC,利用應用程式向導産生一個MFC程式,假設工程名為IEGIF,第一步選擇單文檔程式,語言下拉清單随便選。第二步複選"Windows Sockets"和"ActiveX Controls",其它步驟預設。

  利用IWebBrowser元件前當然要先包含它需要的頭檔案了。在"stdafx . h"中添加下列檔案名:

/ #undef __urlmon_h__ #include <urlmon.h> #undef _SHLOBJ_H_ #include <shlobj.h> #undef _WINNETWK_ #include <winnetwk.h> #undef __AFXHTML_H__ #include "afxhtml.h"

在IEGIFView . h檔案裡CIEGIFView類的聲明中添加下列代碼:

public:   IWebBrowser2 *m_pBrowser;   CWnd     m_wndBrowser;  IWebBrowser2 的容器   void      Navigate(CString); ///調用IWebBrowser2的Navigate接口

在CIEGIFView類的構造函數中初始化指針:

CIEGIFView:: CIEGIFView () {   m_pBrowser = NULL; }

在IEGIFView . cpp檔案裡定義下列函數:

void CIEGIFView::Navigate(CString strURL) {   COleVariant   empty;   BSTR bstrURL = strURL.AllocSysString();   m_pBrowser->Navigate (bstrURL, COleVariant((long) 0, VT_I4), empty, empty, empty); }

在IEGIFView . cpp檔案裡定義消息處理函數:

///響應WM_CREATE int CIEGIFView::OnCreate(LPCREATESTRUCT lpCreateStruct) {   if (CView::OnCreate(lpCreateStruct) == -1)     return -1;         RECT rectClient;   GetClientRect(&rectClient); ///在用戶端整個區域顯示GIF   ///建立控件   if (! m_wndBrowser.CreateControl(CLSID_WebBrowser, NULL, WS_VISIBLE | WS_CHILD,   rectClient, this, AFX_IDW_PANE_FIRST))   {     DestroyWindow();     return FALSE;   }   ///得到指針   LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();   HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowser);   if (! SUCCEEDED(hr))   {     m_pBrowser = NULL;     m_wndBrowser.DestroyWindow();     DestroyWindow();     return FALSE;   }      return 0; } ///響應指令ON_COMMAND(ID_OPENGIF, OnOpenGIF) ///随便用一個按鈕,或菜單項。ID為ID_OPENGIF void CIEGIFView::OnOpenGIF() {   CFileDialog dlg(TRUE, NULL, NULL);     if(dlg.DoModal() == IDCANCEL)   {     return;   }   Navigate(dlg.GetPathName()); }

EVC開發執行個體三:浏覽器視窗

  圖1 顯示GIF截圖