曾有人問過我關于顯示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());
}
圖1 顯示GIF截圖