青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

Internet Explorer 編程簡述(八)實(shí)現(xiàn)瀏覽歷史菜單

關(guān)鍵字:ITravelLogStg, IEnumTravelLogEntry, ITravelLogEntry

 

1、概述

Internet Explorer的瀏覽歷史菜單在4.0版本開始出現(xiàn),但直到5.5之前,微軟都未公布用于訪問瀏覽歷史的COM接口,如今已是IE6.0大行其道的年代,用于訪問瀏覽歷史的接口也早已公布多時(shí),本文的目的則是試圖拋磚引玉,簡單介紹用于訪問瀏覽歷史的Travel Log接口,并用一個(gè)小小的類CIETravelLog來實(shí)現(xiàn)對(duì)Travel Log的封裝。

 

2、IOmHistory接口

在早些時(shí)候的MSDN中,我們能夠查閱到關(guān)于瀏覽歷史的接口僅有IOmHistory,而該接口實(shí)際上對(duì)應(yīng)的是瀏覽器中可以通過腳本訪問的“history”對(duì)象。對(duì)于“history”對(duì)象,MSDN中是這樣說的:

 

For security reasons, the history object does not expose the actual URLs in the browser history. It does allow navigation through the browser history by exposing the back, forward, and go methods. A particular document in the browser history can be identified as an index relative to the current page. For example, specifying -1 as a parameter for the go method is the equivalent of clicking the Back button.

 

This object is available in script as of Microsoft Internet Explorer 3.0.

 

即為了安全的原因,IOmHistory接口僅提供了有限的幾個(gè)方法來完成在瀏覽器中前進(jìn)、后退等操作,并沒有提供訪問歷史列表Url的能力。這也難怪,該接口在IE 3.0時(shí)代已經(jīng)存在,而當(dāng)時(shí)IE并不成熟,可編程能力也不甚強(qiáng)大。一直到IE 4.0通過與Windows 98捆綁銷售一統(tǒng)天下之后,相關(guān)的文檔才逐漸豐富,多窗口瀏覽器等基于Internet Explorer/WebBrowser Control的應(yīng)用軟件也才鋪天蓋地開來。但在IE 5.5接口公布之前,要完全模擬IE的Travel Log行為,并不是一件容易的事。最容易想到的方法就是在BeforeNavigate、DocumentComplete等事件發(fā)生之時(shí)記錄/修改Url并加以保存(我在早些時(shí)候也這樣做過),但是效果不甚理想,尤其是瀏覽包含F(xiàn)rame的網(wǎng)頁時(shí),處理更是麻煩。當(dāng)然,要完全模擬亦非難事,只不過開發(fā)人員都知道微軟公布接口是早晚的事,所以也沒有人花大力氣在模擬IE的Travel Log行為上。

 

3、Travel Log簡介

Internet Explorer 5.5推出以后,Travel Log接口也就開始出現(xiàn)在MSDN中,它是專門為OLE嵌入WebBrowser Control的應(yīng)用程序設(shè)計(jì)的,其目的是“提高和加強(qiáng)用戶的訪問日志體驗(yàn)”(improve and enhance the user's travel log experience)。事實(shí)上,稍后我會(huì)提到,Travel Log接口正日益成為應(yīng)用程序中的重要接口之一。

微軟公布的Travel Log共包含三個(gè)接口:ITravelLogStg, IEnumTravelLogEntry和ITravelLogEntry。

 

  • ITravelLogStg——該接口提供了用于在Travel Log中添加、刪除、枚舉日志(瀏覽歷史)的方法,本文需要用到的幾個(gè)方法列舉如下:

方法名     用途

EnumEntries 為訪問日志項(xiàng)創(chuàng)建枚舉器(IEnumTravelLogEntry接口指針)

GetRelativeEntry 返回一個(gè)日志項(xiàng)

TravelTo 訪問一個(gè)日志項(xiàng)

  • IEnumTravelLogEntry——該接口提供用于枚舉日志項(xiàng)所必需的方法,本文只用到一個(gè)方法:

方法名     用途

Next   枚舉下一個(gè)日志項(xiàng)(返回ITravelLogEntry接口指針)

  • ITravelLogEntry——該接口只有兩個(gè)方法,分別用于返回日志項(xiàng)的Title和Url:

方法名     用途

GetTitle 返回日志項(xiàng)的Title

GetURL 返回日志項(xiàng)的Url

 

接口準(zhǔn)備好了,我們也就很容易得知它們之間的關(guān)系:

  • 要得到相對(duì)于當(dāng)前頁面的日志項(xiàng)列表,首先應(yīng)通過ITravelLogStg接口創(chuàng)建一個(gè)枚舉器(IEnumTravelLogEntry接口)。
  • 通過IEnumTravelLogEntry枚舉器的Next方法枚舉出一個(gè)個(gè)的日志項(xiàng)(ITravelLogEntry接口)。
  • 由ITravelLogEntry接口獲取日志項(xiàng)所代表的網(wǎng)頁的Title和Url并加以處理。
  • 訪問相對(duì)于當(dāng)前頁面的某個(gè)日志項(xiàng)時(shí),首先由ITravelLogStg的GetRelativeEntry方法根據(jù)與當(dāng)前頁的距離得到ITravelLogEntry接口,再將后者傳入ITravelLogStg的TravelTo方法以達(dá)到訪問日志項(xiàng)的目的(如前進(jìn)和后退)。

 

也許不是太恰當(dāng),我對(duì)UML也不熟悉,借用一個(gè)偽UML序列圖表示其關(guān)系如下:

 

 

 Travel log

 

4、封裝Travel Log

接下來,我們就用一個(gè)簡單的類來完成對(duì)Travel Log的封裝。如下所示,tlogstg.h包含了Travel Log的相關(guān)接口聲明,該頭文件可以在Platform SDK中找到。

 

#include "tlogstg.h"

 

class CIETravelLog

{

private:

ITravelLogStg *m_pTravelLogStg;

IEnumTravelLogEntry *m_pEnumLogEntry;

ITravelLogEntry *m_pTravalLogEntry;

IWebBrowser2* m_pWebBrowser;

public:

CIETravelLog(void);

~CIETravelLog(void);

void SetWebBrowser(IWebBrowser2* pWebBrowser);

void BuildHistoryMenu(CMenu * pMenu, unsigned char nCount, bool bForward);

void TravelTo(int nPosition);

};

 

CIETravelLog::CIETravelLog(void)

: m_pTravelLogStg(NULL), m_pEnumLogEntry(NULL), m_pTravalLogEntry(NULL), m_pWebBrowser(NULL)

{

}

 

CIETravelLog::~CIETravelLog(void)

{

if ( m_pTravelLogStg != NULL )

{

m_pTravelLogStg->Release();

}

if ( m_pEnumLogEntry != NULL )

{

m_pEnumLogEntry->Release();

}

if ( m_pTravalLogEntry != NULL )

{

m_pTravalLogEntry->Release();

}

if ( m_pWebBrowser != NULL )

{

m_pWebBrowser->Release();

}

}

 

//將瀏覽器的IWebBrowser2接口指針賦予CIETravelLog的實(shí)例

void CIETravelLog::SetWebBrowser(IWebBrowser2* pWebBrowser)

{

if ( (m_pWebBrowser == pWebBrowser) || (m_pWebBrowser == NULL) )

{

return;

}

if ( m_pWebBrowser != NULL )

{

m_pWebBrowser->Release();

}

m_pWebBrowser = pWebBrowser;

 

IServiceProvider *pSP;

HRESULT hr = m_pWebBrowser->QueryInterface(IID_IServiceProvider, (LPVOID*)&pSP);

m_pWebBrowser->Release();

if (SUCCEEDED(hr))

{

hr = pSP->QueryService(SID_STravelLogCursor, IID_ITravelLogStg, (LPVOID*)&m_pTravelLogStg);

pSP->Release();

}

}

 

//創(chuàng)建瀏覽歷史菜單,bForward指明是前進(jìn)還是后退菜單

void CIETravelLog::BuildHistoryMenu(CMenu * pMenu, unsigned char nCount, bool bForward)

{

if ( m_pTravelLogStg == NULL )

{

return;

}

TLENUMF eFlag = bForward ? TLEF_RELATIVE_FORE : TLEF_RELATIVE_BACK;

if ( FAILED(m_pTravelLogStg->EnumEntries( eFlag, &m_pEnumLogEntry ) ) )

{

return;

}

 

ULONG uFetched;

int i=0;

if ( m_pEnumLogEntry !=NULL )

{

while ( SUCCEEDED( m_pEnumLogEntry->Next( 1, &m_pTravalLogEntry, &uFetched ) ) &&

m_pTravalLogEntry && i<10 )//我們最多只需要10條歷史菜單,可根據(jù)實(shí)際情況修改

{

LPOLESTR pszTitle;

m_pTravalLogEntry->GetTitle( &pszTitle );

CString strTitle = pszTitle;

if ( bForward )

{

//ID_IEHISTORY_MIDDLE是預(yù)定義的某個(gè)菜單項(xiàng)ID,從該ID開始前后可以創(chuàng)建10個(gè)菜單項(xiàng),參見下一節(jié)

pMenu->InsertMenu( 0, MF_STRING, ID_IEHISTORY_MIDDLE + ++i, strTitle );

}

else

{

pMenu->InsertMenu( 0, MF_STRING, ID_IEHISTORY_MIDDLE - ++i, strTitle );

}

CoTaskMemFree( pszTitle );

m_pTravalLogEntry->Release();

}

}

}

 

//根據(jù)與當(dāng)前頁面的相對(duì)距離來訪問歷史網(wǎng)頁

void CIETravelLog::TravelTo(int nPosition)

{

if ( m_pTravelLogStg == NULL )

{

return;

}

if SUCCEEDED(m_pTravelLogStg->GetRelativeEntry( nPosition, &m_pTravalLogEntry ))

{

m_pTravelLogStg->TravelTo( m_pTravalLogEntry );

}

}

 

5、使用CIETravelLog

假設(shè)是在我們自己編寫的多窗口瀏覽器中使用Travel Log。為簡單起見,我們聲明一個(gè)CIETravelLog的全局對(duì)象g_IETravelLog,以便在任何地方調(diào)用。然后在適當(dāng)?shù)牡胤剑鏑MainFrame的TBN_DROPDOWN消息(工具條菜單下拉消息)處理函數(shù)OnDropDown中,添加下面的代碼,用以創(chuàng)建瀏覽歷史菜單:

//GetActiveWebBrowserPtr返回活動(dòng)的瀏覽器IWebBrowser2接口指針

IETravelLog.SetWebBrowser( GetActiveWebBrowserPtr );

//bForward為true則創(chuàng)建“前進(jìn)”菜單,否則創(chuàng)建“后退”菜單

IETravelLog.BuildHistoryMenu( &Menu, 10, bForward);

 

以下定義為菜單項(xiàng)ID的范圍,前后共可以容納10個(gè)菜單項(xiàng),可根據(jù)實(shí)際情況修改。

#define ID_IEHISTORY_FIRST  60200

#define ID_IEHISTORY_MIDDLE 60210

#define ID_IEHISTORY_LAST   60220

 

添加命令處理函數(shù)OnTravelHistoryUrl用以響應(yīng)從ID_IEHISTORY_FIRST到ID_IEHISTORY_LAST的菜單命令。

 

ON_COMMAND_RANGE(ID_IEHISTORY_FIRST, ID_IEHISTORY_LAST, OnTravelHistoryUrl)

 

void CMainFrame::OnTravelHistoryUrl(UINT nID /* Command ID */)

{

//nID - ID_IEHISTORY_MIDDLE即為要訪問的瀏覽歷史到當(dāng)前頁面的距離

g_IETravelLog.TravelTo( nID - ID_IEHISTORY_MIDDLE );

}

 

6、再談Travel Log

前面我提到“Travel Log接口正日益成為應(yīng)用程序中的重要接口之一”,此處加以說明。從微軟平臺(tái)的開發(fā)模式及導(dǎo)向來看,基于Internet Explorer/WebBrowser Control的應(yīng)用勢必會(huì)成為主流。在下一代的操作系統(tǒng)Longhorn中,應(yīng)用程序界面的描述將完全由XML的一個(gè)特化——XAML來完成,而XAML的解析將由瀏覽器完成。微軟說未來應(yīng)用程序的部署將會(huì)十分容易,本地應(yīng)用和基于瀏覽器的應(yīng)用之間的差異將會(huì)被逐漸淡化,而實(shí)現(xiàn)這一目標(biāo)的一個(gè)重要表現(xiàn)就是,在將來的操作系統(tǒng)平臺(tái)上,應(yīng)用程序?qū)嶋H上時(shí)刻都將運(yùn)行在Internet Explorer中,Internet Explorer在某種程度上來說變成了一個(gè)容器。

于是,扎根于Internet Explorer的Travel Log自然而然地就被整合到了我們的應(yīng)用程序中。君不見,我們每天在資源管理器和瀏覽器上完成的工作,不就是在Travel Log中來來回回地跑嗎?如果所有的應(yīng)用程序都嵌入到Internet Explorer中運(yùn)行,那么我們?cè)趹?yīng)用程序中所作的操作便自然得到了記錄,“前進(jìn)”和“后退”也就很Easy了。

很多軟件都已經(jīng)或多或少地開始采用基于Internet Explorer的模式,如Microsoft Money、Microsoft Encarta、Visual Studio.net的安裝程序等等,都是很好的范例。所以,就目前來說,將我們的應(yīng)用程序按這種模式編寫(可參考《利用瀏覽器實(shí)現(xiàn)程序界面與實(shí)現(xiàn)的分離》),不是可以早一點(diǎn)獲得“訪問日志的體驗(yàn)”嗎?

何樂而不為。

 

引用地址:《Internet Explorer 編程簡述(八)實(shí)現(xiàn)瀏覽歷史菜單

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=308620


posted on 2007-07-29 15:22 旅途 閱讀(930) 評(píng)論(0)  編輯 收藏 引用 所屬分類: BHO

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品mv在线观看| 欧美午夜片欧美片在线观看| 久久国产欧美精品| 狠狠色狠狠色综合| 欧美大片va欧美在线播放| 夜夜嗨av一区二区三区四季av | 欧美成人资源网| 一区二区三区.www| 国产亚洲一区二区三区| 欧美国产精品久久| 亚洲免费在线观看| 亚洲福利视频专区| 一本一道久久综合狠狠老精东影业| 欧美色一级片| 久久综合色播五月| 亚洲夜晚福利在线观看| 欧美电影免费观看高清| 亚洲欧美综合一区| 亚洲人成毛片在线播放女女| 国产女优一区| 欧美日韩免费一区二区三区视频 | 亚洲国产精品v| 国产精品福利网| 欧美成人免费在线视频| 午夜视频在线观看一区二区三区| 91久久国产综合久久91精品网站| 久久久久成人精品免费播放动漫| 亚洲一区观看| 亚洲精品日韩久久| 激情91久久| 国产九九视频一区二区三区| 欧美日韩免费观看一区=区三区| 久久亚洲精品伦理| 欧美一级片一区| 亚洲少妇诱惑| 亚洲精选久久| 最新69国产成人精品视频免费| 六月婷婷久久| 久久精品av麻豆的观看方式 | 性娇小13――14欧美| 日韩一区二区高清| 91久久综合| 亚洲第一精品电影| 黄色在线成人| 国产永久精品大片wwwapp| 欧美日韩在线观看视频| 欧美国产日产韩国视频| 久久综合给合| 久久深夜福利| 久久免费少妇高潮久久精品99| 亚洲欧美一区二区视频| 亚洲图片欧洲图片av| 日韩视频亚洲视频| 91久久精品国产91性色| 欧美激情在线观看| 久久riav二区三区| 经典三级久久| 欧美成人有码| 蜜桃精品久久久久久久免费影院| 久久精品二区三区| 欧美在线视频一区二区| 欧美一区二区精品久久911| 亚洲欧美福利一区二区| 亚洲欧美大片| 欧美一区91| 久久黄色影院| 久久亚洲视频| 欧美成人一区二区三区片免费| 欧美大片免费观看| 欧美日韩午夜在线| 国产精品久久久久一区| 国产精品婷婷午夜在线观看| 国产欧美日韩亚洲| 红桃视频成人| 91久久综合亚洲鲁鲁五月天| 亚洲理论在线观看| 亚洲一区二区少妇| 欧美资源在线| 免费高清在线一区| 91久久久一线二线三线品牌| 99国内精品久久| 亚洲综合第一| 久久久久久伊人| 欧美福利视频在线| 欧美午夜片在线观看| 国产欧美日韩精品专区| 黄色一区三区| 亚洲美女av黄| 亚洲欧美日韩另类| 久久蜜桃香蕉精品一区二区三区| 欧美va亚洲va国产综合| 亚洲精品视频一区| 亚洲欧美国产视频| 久久伊人精品天天| 欧美日韩另类视频| 国产欧美日韩一级| 亚洲人成毛片在线播放女女| 亚洲亚洲精品三区日韩精品在线视频| 亚洲欧美在线看| 蜜臀av一级做a爰片久久| 亚洲欧洲精品一区| 亚洲欧美欧美一区二区三区| 久久久久久电影| 欧美日韩亚洲一区三区| 国产在线高清精品| 99re6热只有精品免费观看| 亚洲欧美精品在线| 免费欧美网站| 亚洲深爱激情| 老司机精品福利视频| 欧美午夜免费电影| 在线精品国产欧美| 亚洲欧美一区二区精品久久久| 美女精品在线观看| 亚洲一区二区三区四区在线观看| 久久综合网色—综合色88| 欧美日韩一卡二卡| 伊人天天综合| 亚洲欧美一区二区三区极速播放| 美女诱惑黄网站一区| 亚洲视频图片小说| 久久尤物视频| 国产精品亚洲人在线观看| 亚洲欧洲另类国产综合| 久久精品成人欧美大片古装| 亚洲日韩欧美一区二区在线| 久久精品99无色码中文字幕| 欧美午夜精品久久久久久浪潮| 91久久在线| 老鸭窝91久久精品色噜噜导演| 亚洲一区二区三区免费在线观看| 欧美福利视频在线观看| 精品成人一区二区| 欧美伊人久久| 亚洲毛片一区| 欧美1区3d| 国产在线高清精品| 欧美一区二区三区播放老司机| 亚洲黄色三级| 巨乳诱惑日韩免费av| 国产一区二区在线观看免费播放 | 美日韩丰满少妇在线观看| 欧美日韩一本到| 伊人久久亚洲热| 久久爱91午夜羞羞| 一区二区三区精品在线| 欧美经典一区二区| 亚洲国产精品久久91精品| 久久亚洲私人国产精品va媚药| 亚洲女性喷水在线观看一区| 国产精品扒开腿做爽爽爽软件| 亚洲精品资源| 亚洲电影免费在线观看| 久热这里只精品99re8久| 欧美激情一区二区三区全黄| 亚洲高清视频一区| 牛夜精品久久久久久久99黑人 | 欧美激情视频在线播放| 亚洲激情视频在线播放| 免费在线亚洲| 久久久蜜桃一区二区人| 国产一区在线看| 久久久久欧美| 久久成人免费电影| 国内一区二区三区| 久久久亚洲欧洲日产国码αv| 香蕉成人伊视频在线观看| 国产欧美婷婷中文| 久久九九精品99国产精品| 欧美在线观看视频一区二区| 国产日韩欧美二区| 久久久久9999亚洲精品| 久久国产一区| 亚洲欧美一区二区三区久久 | 欧美不卡视频一区| 亚洲人成毛片在线播放女女| 亚洲国产成人精品久久久国产成人一区| 久久影视三级福利片| 亚洲精一区二区三区| 99精品99| 国产三级精品在线不卡| 免播放器亚洲一区| 欧美阿v一级看视频| 一区二区三区四区精品| 亚洲一区二区三区在线视频| 国产亚洲精品美女| 久久亚洲免费| 欧美成人午夜激情视频| 一区二区三区四区蜜桃| 亚洲国产mv| 亚洲视频在线一区| 亚洲影视综合| 国内成+人亚洲| 欧美激情网友自拍| 欧美色综合天天久久综合精品| 欧美亚洲日本网站| 久久亚洲一区二区| 在线亚洲免费视频| 性色av一区二区三区在线观看 | 亚洲精选久久|