有很多網友來信都問關於開發瀏覽器的問題。能夠理解,現在大多數基於CE的產品都具有上網瀏覽的功能。CE也為此提供了兩種IE瀏覽器的源碼。一種IESAMPLE、另一種IESIMPLE。他們的存放路徑在%_WINCEROOT%\Public\IE\Oak下。區別在於IESAMPLE就是CE下IE的標準版本的源碼,有工具列、狀態列、地址欄,還有Internet選項、收藏夾等等。和PC Windows的IE幾乎一樣。而IESIMPLE是mini版本,只有基本的IWebBrowser控制項,使用者介面上只有全螢幕顯示的網頁,預設用快速鍵來操作。我早先對IESIMPLE的源碼進行了分析,因為我對OLE知之甚少,所以在分析過程中並不能100%的掌握源碼,好在這並不影響我對IESIMPLE整體的分析。相信網友看過了這兩篇文章(還有一篇關於配置)後如果要基於IESIMPLE的源碼開發自己的瀏覽器就容易多了。之所以選擇IESIMPLE,是因為它的源碼相對要精簡的多,只有實現主要功能的代碼,沒有收藏夾一類的代碼,在此基礎上加入我們希望的功能和介面要容易些。再有IESIMPLE和IESAMPLE的主要代碼基本相同。下面的圖展示了IESIMPLE的基本流程,關於IE的配置將在下一篇文章中講解。
IESIMPLE只有兩個.h檔案和一個.cpp檔案。mainwnd.h中聲明了類CMainWnd,在類CMainWnd的眾多成員變數中,_hWnd儲存CMainWnd視窗控制代碼,_pBrowser儲存介面IWebBrowser2的指標,_hWndBrowser儲存Browser視窗控制代碼,_rcWnd儲存CMainWnd的視窗尺寸。這幾個變數總在代碼中出現,故在此提出。下面講解上面的圖中提到的每個函數的功能:
WinMain函數先到註冊表的特定位置中找到建立CMainWnd視窗的線程的棧的大小。如果這個值適當,那麼在建立線程的時候就採用這個棧的值。接著註冊CMainWnd視窗類別,之後調用PeekMessage建立訊息佇列,接著調用HandleNewWindows2函數,在這個函數執行結束後進入while迴圈,迴圈體的內容是等待函數,因為每個線程在結束前都使事件對象ghExitEvent處於有訊號狀態,所以當所有建立的線程都結束時,主線程也就退出while迴圈後結束。對於HandleNewWindows2函數,在整個IESIMPLE運行過程中,它至少被執行一次。每當在新視窗中開啟網頁時,它就被執行一次。HandleNewWindow2函數先建立一個CMainWnd對象,然後遞增記錄線程數的全域變數,之後建立一個新的線程,線程函數為NewWindow。對於NewWindow函數,它先初始化COM庫,然後調用CMainWnd的Create成員函數。之後調用GetMessage函數收集訊息並處理。當視窗退出時作結束處理工作。對於Create成員函數,它調用CreateWindowEx函數建立視窗和進度條視窗,之後調用CreateBrowser函數建立瀏覽器視窗,最後調用HandleCommand( ID_FULLSCREEN, 0 )全螢幕顯示網頁內容。對於CreateBrowser函數,它首先調用GetProxyOption函數得到Internet串連代理選項,之後調用CoCreateInstance函數建立WebBrowser對象,之後調用SetClientSit設定WebBrowser的用戶端,接著啟用IWebBrowser控制項,之後儲存介面IWebBrowser2的指標和儲存參與WebBrowser本地啟用的視窗控制代碼。
其它的函數HandleCommand處理使用者命令,這些命令如向前、向後、首頁、重新整理、停止等。對命令的執行實際上是調用IWebBrowser2的介面函數。MainWndProc函數是CMainWnd的訊息處理函數。OpenURLDlgProc函數是"開啟"對話方塊的訊息處理函數。還有兩個函數在下一篇文章中講解。