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

旅途

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

Internet Explorer 編程簡(jiǎn)述(十)響應(yīng)來(lái)自HTML Element的事件通知——幾個(gè)好用的類(lèi)

鍵字:HTML Element, Sink
 
1、概述
實(shí)現(xiàn)了對(duì)Webbrowser的resuing之后我們便會(huì)發(fā)現(xiàn)有時(shí)候我們還需要處理瀏覽器中的元素(HTML Element)。這種處理包括主動(dòng)和被動(dòng)兩個(gè)方面,像《FAQ:如何訪問(wèn)WebBrowser的滾動(dòng)條、《FAQ:操縱下拉列表、《FAQ:兩種方法訪問(wèn)多層嵌套的frame等 文章所演示的就是主動(dòng)的處理。通常我們從Webbrowser獲得一個(gè)Web文檔接口(IHTMLDocumentx),從它出發(fā)便可訪問(wèn)到瀏覽器所包含 的一切HTML元素。而被動(dòng)的處理則是在COM技術(shù)中稱(chēng)為Sink的技術(shù),我更喜歡的說(shuō)法是事件通知。當(dāng)文檔的下載進(jìn)度發(fā)生變化時(shí),我們可以獲得 ProgressChange通知,當(dāng)Webbrowser下載完HTML文檔時(shí),我們可以獲得DocumentComplete的通知,而當(dāng)鏈接被點(diǎn) 擊,或圖片被拖動(dòng)時(shí),我們?nèi)绾潍@得通知呢?本文希望能夠給出部分的答案。
 
2、HtmlObj Template
如何Sink一個(gè)HTML Element并不是本文的重點(diǎn),其理論我不是太了解,也懶得去搞透徹,所以使用現(xiàn)成的庫(kù)來(lái)實(shí)現(xiàn)。CodeProject上的一篇文章《CHtmlObj Template》給出的一個(gè)模板類(lèi)CHtmlObj就非常好用。下面的例子是針對(duì)Html Anchor Element的一個(gè)實(shí)例化。
 
#include "HtmlObj.h"
 
class CHtmlAnchorElement : public CHtmlObj<IHTMLAnchorElement,
&DIID_HTMLAnchorEvents> 
{
public:
CHtmlAnchorElement(CHtmlDocument2* pParentDoc2);
virtual ~CHtmlAnchorElement();
 
virtual HRESULT OnInvoke(DISPID dispidMember,REFIID riid,
LCID lcid, WORD wFlags,
DISPPARAMS * pdispparams, VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr);
};

HRESULT CHtmlAnchorElement::OnInvoke(DISPID dispidMember,
REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS * pdispparams, VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
HRESULT hr = E_NOTIMPL;
switch(dispidMember)
{
case DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER :
{//當(dāng)鼠標(biāo)經(jīng)過(guò)鏈接時(shí),我們?cè)谶@里獲得通知
hr = S_OK;
      // TODO: add code to handle on mouse over events
break;
}
case DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT :
{//當(dāng)鼠標(biāo)從鏈接上移開(kāi)時(shí),我們?cè)谶@里獲得通知,其它的Dispatch ID可根據(jù)需要添加
hr = S_OK;
      // TODO: add code to handle on mouse out events
break;
}
default:
{
break;
}
}
 
return hr;
}
 
當(dāng) 我們得到某個(gè)鏈接的HTML接口指針,便可調(diào)用CHtmlAnchorElement繼承自CHtmlObj的SetSite(IUnknown *pUnkSite)成員函數(shù)傳入該接口指針。在CHtmlObj類(lèi)內(nèi)部用一個(gè)智能指針m_spHtmlObj來(lái)保存相應(yīng)的HTML Element接口指針,所以當(dāng)上面的ONMOUSEHOVER和ONMOUSEOUT兩個(gè)事件通知到達(dá)時(shí),從m_spHtmlObj就可以訪問(wèn) IHTMLAnchorElement的所有成員,如從href獲得鏈接的Url等,此處不再贅述。
 
3、CHtmlElements類(lèi)
有 了CHtmlObj之后我們又會(huì)發(fā)現(xiàn)實(shí)踐中常常會(huì)需要多個(gè)相同類(lèi)型的CHtmlObj。比如包含F(xiàn)rame的網(wǎng)頁(yè)中每個(gè)Frame的HTML Document都需要一個(gè)CHtmlObj來(lái)Sink其事件。所以我們還需要有效地管理這些相同類(lèi)型的CHtmlObj。下面是我寫(xiě)的一個(gè)簡(jiǎn)單的模板類(lèi) CHtmlElements,它通過(guò)CMap來(lái)管理多個(gè)CHtmlObj對(duì)象。
 
template<class THtmlElement> class CHtmlElements
{
typedef CMap<LPDISPATCH, LPDISPATCH, THtmlElement*, THtmlElement*> CMapDispToHtmlElement;
CMapDispToHtmlElement m_htmlElements;
BOOL IsSiteConnected( LPDISPATCH pDisp )
{
THtmlElement *pElement;
return m_htmlElements.Lookup( pDisp, pElement );
}
public :
CHtmlElements( void )
{
}
~CHtmlElements( void )
{
}
public :
void SetSite( LPDISPATCH pDisp )
{
if ( IsSiteConnected( pDisp ) ) //檢查以避免多余的Sink
{
return ;
}
THtmlElement *pElement = new THtmlElement; //通過(guò)模板類(lèi)型創(chuàng)建相應(yīng)的類(lèi)的實(shí)例進(jìn)行連接
pElement->SetSite( pDisp );
m_htmlElements.SetAt( pDisp, pElement );
}
 

//在合適的地方調(diào)用Clear釋放所管理的內(nèi)存

void Clear(void)

{

POSITION pos = m_htmlElements.GetStartPosition();

THtmlElement *pElement = NULL;

LPDISPATCH pDisp = NULL;

while (pos != NULL)

{

m_htmlElements.GetNextAssoc( pos, pDisp, pElement );

m_htmlElements.RemoveKey( pDisp );

delete pElement;

}

}

};
 
假設(shè)我們有一個(gè)象CHtmlAnchorElement那樣派生自CHtmlObj的類(lèi)CHtmlDocument2,使用CHtmlElements時(shí)這樣聲明:
 
typedef CHtmlElements<CHtmlDocument2> CHtmlDocuments;
typedef CHtmlElements<CHtmlAnchorElement> CHtmlAnchors;
 
class CMyView : public CHtmlView
{
private :
CHtmlDocuments m_htmlDocs;
CHtmlAnchors m_htmlAnchors;
}
 
在DocumentComplete時(shí)就可以這樣連接到瀏覽器的文檔對(duì)象:
void CMyView ::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR lpszURL)
{
m_htmlDocs.SetSite(pDisp);
}
 
如 果想一次性連接上文檔中所有的Anchor Element,可以通過(guò)IHTMLDocument2::get_anchors獲得包含所有IHTMLAnchorElement接口指針的 IHTMLElementCollection,再遍歷其中的每個(gè)元素,分別調(diào)用m_htmlAnchors.SetSite即可。當(dāng)然,一次性的 Sink全部鏈接可能并不是個(gè)好注意,我更愿意在CHtmlDocument2中響應(yīng)事件再通過(guò)其它手段來(lái)訪問(wèn)當(dāng)前位置的HTML Element。
 
4、結(jié)論
響 應(yīng)HTML Element的事件通知對(duì)于瀏覽器編程來(lái)說(shuō)是一個(gè)非常強(qiáng)大的手段,它可以更深入細(xì)化地控制瀏覽器中的文檔及其HTML元素,實(shí)現(xiàn)更為高級(jí)的功能,比如所 謂的“超級(jí)拖放”(許多多窗口瀏覽器都提供了該功能,但實(shí)際上沒(méi)有哪個(gè)瀏覽器完美地實(shí)現(xiàn)了對(duì)URL、文字及圖片的拖放)。
 
5、參考資料
Codeproject: HtmlObj Template
 
引用地址:《Internet Explorer 編程簡(jiǎn)述(十)響應(yīng)來(lái)自HTML Element的事件通知——幾個(gè)好用的類(lèi)


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


posted on 2007-07-29 15:37 旅途 閱讀(907) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 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>
            亚洲激情综合| 亚洲精品自在在线观看| 亚洲影音一区| 黄色欧美成人| 日韩视频免费观看高清完整版| 国产精品久久一区二区三区| 久久国产一二区| 欧美电影在线播放| 久久久精品性| 欧美日韩中文字幕在线视频| 久久综合狠狠综合久久综青草| 欧美日韩午夜在线视频| 麻豆成人av| 国产精品免费一区二区三区在线观看 | 久久香蕉国产线看观看av| 欧美大片在线看免费观看| 久久国产精品亚洲77777| 欧美二区在线观看| 久久精品一区二区三区四区| 欧美日韩国产一区二区| 牛牛影视久久网| 国产午夜精品久久| 亚洲午夜久久久久久久久电影院| 亚洲盗摄视频| 久久久久亚洲综合| 久久精品国产亚洲a| 国产精品国产a级| 亚洲精品亚洲人成人网| 亚洲国产天堂久久综合网| 久久国产视频网| 久久精品99久久香蕉国产色戒| 欧美日韩在线一区二区三区| 亚洲欧洲一区二区三区在线观看| 国产伦精品一区二区三区视频孕妇| 亚洲美女在线观看| 99国产精品久久久久久久久久 | 一区二区三区日韩欧美| 美腿丝袜亚洲色图| 欧美成人综合在线| 亚洲国产精品久久久久婷婷884 | 亚洲免费在线视频| 欧美日韩精品久久久| 亚洲人www| av成人激情| 欧美日韩午夜| 一区二区日韩伦理片| 亚洲欧美日韩中文视频| 国产精品久久久一本精品| 中文在线一区| 欧美一级免费视频| 国产日韩欧美在线看| 亚洲欧美日韩视频一区| 欧美在线观看视频| 国内成人精品视频| 久久噜噜亚洲综合| 亚洲成人在线视频播放| 亚洲免费精彩视频| 欧美三级网页| 亚洲欧美日韩国产一区二区| 久久精品国产一区二区三区| 国产亚洲福利一区| 狂野欧美一区| 亚洲人精品午夜| 亚洲综合精品| 国产一区高清视频| 蜜桃av综合| 夜夜爽99久久国产综合精品女不卡| 亚洲视频精选在线| 国产乱码精品| 老司机精品导航| 亚洲精品永久免费| 欧美一区二区网站| 亚洲国产精品va在线看黑人动漫| 欧美成人精品在线观看| 免费成人激情视频| 欧美精品偷拍| 亚洲线精品一区二区三区八戒| 性做久久久久久免费观看欧美| 国产真实精品久久二三区| 久久免费高清| 夜夜精品视频| 免费日韩视频| 亚洲一区二区三区视频| 国内精品久久久久影院 日本资源| 美国成人直播| 亚洲影院免费| 亚洲韩国一区二区三区| 性欧美1819sex性高清| 在线看不卡av| 国产精品男女猛烈高潮激情| 久久久久久久999精品视频| 亚洲国产三级在线| 久久岛国电影| 一区二区av| 樱花yy私人影院亚洲| 国产精品高精视频免费| 麻豆精品在线观看| 亚洲欧美日韩在线综合| 91久久夜色精品国产网站| 欧美一区午夜精品| 亚洲最黄网站| 亚洲风情亚aⅴ在线发布| 国产精品亚洲产品| 欧美顶级少妇做爰| 久久精品一区四区| 亚洲小说区图片区| 亚洲精品乱码久久久久久久久| 久久久精品日韩欧美| 亚洲女与黑人做爰| av成人免费在线| 亚洲欧洲一区二区三区在线观看 | 亚洲成色777777女色窝| 久久久精品日韩欧美| 亚洲在线1234| av成人福利| 亚洲日本久久| 亚洲电影第三页| 国语精品中文字幕| 国产精品视频xxxx| 欧美视频你懂的| 欧美日韩成人在线观看| 欧美成人精品一区二区三区| 久久久精品免费视频| 欧美一区二区精品| 亚洲欧美在线免费| 亚洲女女做受ⅹxx高潮| 亚洲视频免费看| 99精品久久久| 日韩视频免费看| 99国产一区| 99精品久久久| 亚洲校园激情| 亚洲欧美日韩国产一区二区| 亚洲在线视频一区| 亚洲综合成人在线| 亚洲专区一区二区三区| 亚洲一区精品视频| 午夜精品久久久久久久99水蜜桃 | 亚洲一区三区在线观看| 一区二区三区国产| 亚洲视频免费在线| 亚洲在线观看视频| 亚洲欧美另类在线观看| 午夜国产不卡在线观看视频| 亚洲国产婷婷香蕉久久久久久99 | 欧美日韩精品免费观看视一区二区 | 亚洲欧洲另类国产综合| 亚洲午夜久久久| 另类春色校园亚洲| 一区二区三区国产在线| 久久久久se| 国产精品久久久久久久电影 | 亚洲国产美女| 性色一区二区| 亚洲国产日韩一级| 久久国产精品高清| 欧美三级乱人伦电影| 亚洲第一福利视频| 欧美一区二区三区四区在线观看地址| 欧美黄色片免费观看| 亚洲欧美制服中文字幕| 欧美精品在线一区二区| 激情成人av在线| 午夜久久黄色| 最新日韩av| 久久亚洲私人国产精品va媚药| 国产精品卡一卡二| 一区二区三区四区国产精品| 欧美成人免费在线| 欧美在线观看天堂一区二区三区| 欧美日韩在线观看视频| 亚洲精品视频一区| 欧美高清免费| 久久久精品视频成人| 国产欧美一区二区精品秋霞影院 | 亚洲国产精品综合| 久久精品国产欧美亚洲人人爽| 在线视频精品一区| 欧美激情视频给我| 91久久国产综合久久蜜月精品 | 亚洲天堂网站在线观看视频| 欧美黄在线观看| 亚洲第一在线综合在线| 久久精品中文| 校园激情久久| 国产免费成人av| 亚洲欧美日本另类| 一本大道久久a久久综合婷婷 | 欧美一区二区三区啪啪| 国产精品一区二区久久国产| 亚洲愉拍自拍另类高清精品| 亚洲免费观看| 欧美日韩国产成人在线| 99热在线精品观看| 亚洲人成在线播放| 欧美日韩三区| 亚洲在线一区二区三区| 亚洲无线一线二线三线区别av| 欧美午夜影院| 欧美一区二区精美|