用Visual C++打造IE瀏覽器(1)

來源:互聯網
上載者:User
 前言

  IE瀏覽器作為微軟Windows系統搭售方案的一個瀏覽工具,用來瀏覽千姿百態的網頁,目前它已經佔據了瀏覽器市場的半壁江山,成為Windows使用者不可或缺的工具。首先,它的介面設計的很漂亮,如扁平按紐(按鈕上的映像為灰色,當滑鼠放在按鈕上時,按鈕突起,這種狀態稱為手柄,並且其上的映像變得鮮豔醒目)、按鈕上的文字說明以及按鈕邊上的小黑三角形狀的下拉式箭頭(單擊時顯示下拉式功能表)、工具條上的地址輸入欄等,都體現了Windows2000的風格;其次,它的收藏欄可以收藏使用者喜愛的網路地址,這一切都為IE的流行打下了堅實的基礎。說了那麼多,也許讀者朋友們感覺到IE實現起來一定非常困難,其實IE也是個"紙老虎",實現它的痛點主要是在介面效果和顯示收藏夾上,筆者在本文中有針對性的敘述了IE介面、收藏網頁的顯示、網頁的瀏覽等功能的實現,仔細看過這篇文章後,相信讀者朋友們一定可以打造出一個屬於自己的瀏覽器。本文中的代碼在Windows2000、Visual C++6.0環境下編譯通過,程式運行正常。程式運行介面如下:


圖一、瀏覽器的運行介面

  一、瀏覽器的介面實現

  首先啟動Visual C++6.0,產生一個名為MYIE單文檔項目,注意在此過程中不要選擇工具條和狀態條選項,這樣才能更方便我們在後續工作中用代碼實現Windwos2000風格的工具條、狀態條;在工具條中添加地址欄;項目的視圖類的基類為ChtmlView,該類的Navigate2()成員函數專門用來現實超文字格式設定的文檔。在主架構類CmainFrame中定義CStatusBar m_wndStatusBar(狀態條對象)、CToolBar m_wndToolBar(工具列對象)、CReBar m_wndReBar(、CComboBoxEx m_wndAddress(擴充的組合框對象,用來作為地址欄)、CAnimateCtrl m_wndAnimate(動畫控制項,用來在工具列上顯示動畫)、映像列表對象CImageList img(存放顯示在工具列上的表徵圖)等對象。向當前項目AVI資源檔,ID標誌IDR_MFCAVI,添加Bitmap(位元影像)資源,ID標誌分別為IDB_COLDTOOLBAR、IDB_HOTTOOLBAR,分別如下所示:


圖二、包含按鈕表徵圖的位元影像

  1)IE風格工具條

  IE風格介面的實現主要在主架構類的CMainFrame::OnCreate()函數中實現,它的主要思想如下: CReBar對象用來作為工具條、地址欄、動畫控制項的容器,CImageList對象,然後分別裝載工具列上按鈕的熱點映像和正常狀態下顯示的映像,並將該對象附給工具條對象,使之建立關聯。為了顯示扁平工具列,需要用CreateEx()函數建立CToolBar對象m_wndToolBar,用ModifyStyle()函數將工具列的風格設為扁平類型,注意這裡不能用CToolBar::Create() 或 CToolBar:: SetBarStyle()設定這種新風格。CToolBar 類不支援TBSTYLE_FLAT,要解決這個問題,必須繞過CToolBar類,使用CWnd::ModifyStyle()。要將某一個工具列按鈕設定為附帶有下拉按鈕,可以調用SetButtonInfo()設定按鈕的風格為TBSTYLE_DROPDOWN。至於按鈕帶有中文提示,用工具列的SetButtonText()就可以輕鬆實現了。下面是實現IE風格介面的代碼和注釋:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CImageList img; //映像列表對象;
CString str; //字串對象;
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndReBar.Create(this)) //建立CReBar對象;
{ TRACE0("Failed to create rebar\n");
return -1; }
if (!m_wndToolBar.CreateEx(this)) //使用CreateEx()函數建立工具條對象;
{ TRACE0("Failed to create toolbar\n");
return -1; }
//設定工具列中的按鈕最大最小尺寸;
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);
//設定工具列上的按鈕支援下拉式箭頭風格;
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//向映像列表裝載熱點映像資源,IDB_HOTTOOLBAR為熱點映像資源ID img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
//圖象列表裝載正常狀態的映像資源,IDB_COLDTOOLBAR為映像資源ID
img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();
//設定工具條為扁平風格
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
//設定工具條上的按鈕個數為9個;
m_wndToolBar.SetButtons(NULL, 9);
// 裝載字串資源,設定按鈕上的文本和按鈕的標識號;
m_wndToolBar.SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0);
str.LoadString(IDS_BACK);
m_wndToolBar.SetButtonText(0, str);
m_wndToolBar.SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1);
str.LoadString(IDS_FORWARD);
m_wndToolBar.SetButtonText(1, str);
m_wndToolBar.SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2);
str.LoadString(IDS_STOP);
m_wndToolBar.SetButtonText(2, str);
m_wndToolBar.SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3);
str.LoadString(IDS_REFRESH);
m_wndToolBar.SetButtonText(3, str);
m_wndToolBar.SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4);
str.LoadString(IDS_HOME);
m_wndToolBar.SetButtonText(4, str);
m_wndToolBar.SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5);
str.LoadString(IDS_SEARCH);
m_wndToolBar.SetButtonText(5, str);
m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6);
str.LoadString(IDS_FAVORITES);
m_wndToolBar.SetButtonText(6, str);
m_wndToolBar.SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7);
str.LoadString(IDS_PRINT);
m_wndToolBar.SetButtonText(7, str);
m_wndToolBar.SetButtonInfo(8, ID_FONT_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 8);
str.LoadString(IDS_FONT);
m_wndToolBar.SetButtonText(8, str);
// 設定工具列上的按鈕尺寸和顯示在按鈕上的表徵圖尺寸;
CRect rectToolBar;
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
//建立組合框,用來作為地址欄;
if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
{ TRACE0("Failed to create combobox\n");
return -1; }
//建立動畫控制項對象,並開啟AVI資源IDR_MFCAVI;
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
//將工具條、地址欄、動畫控制項等添加到CReBar對象中;
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP);
str.LoadString(IDS_ADDRESS);
m_wndReBar.AddBar(&m_wndAddress, str, NULL, RBBS_FIXEDBMP | RBBS_BREAK);
//再次設定工具條風格,使之有工具列提示功能;
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
//設定狀態條;
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{ TRACE0("Failed to create status bar\n");
return -1; }
…….//實現"Favorites"菜單的部分,該部分在第二部分介紹;
return 0;
}

本文引用地址: http://blog.csdn.net/mynote/services/trackbacks/303399.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.