首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

取得IE浏览器页面的滚动条位置(奇怪的现象),该怎么处理

2012-01-19 
取得IE浏览器页面的滚动条位置(奇怪的现象)我通过遍历,给网页内的所有frame安装了事件接收器,然后在事件接

取得IE浏览器页面的滚动条位置(奇怪的现象)
我通过遍历,给网页内的所有frame安装了事件接收器,然后在事件接收器中提供了onscroll方法,目的是截获滚动条的滚动事件,当程序执行后,滚动事件接收到了,即当滚动网页内的滚动条时,onscroll被调用,在onscroll函数中取得滚动条的位置,但是奇怪的是对于有些网页可以正确取得其滚动条的位置,比如:百度,google等,而有些网页取到的滚动条位置却始终是0,比如:网易(www.163.com),我不知道产生这种现象的原因到底是什么?这些网页的滚动条到底有什么不同?为什么对有些网页可以而对某些网页不可以?还望高人指点!

1. 安装连接点的代码如下:

void CIEEventSink::EnumAllDocument( IHTMLDocument2 * pIHTMLDocument2)
{
if( !pIHTMLDocument2 )return;
EnumFrames( pIHTMLDocument2);
}

void CIEEventSink::EnumFrames( IHTMLDocument2 * pIHTMLDocument2)
{
if ( !pIHTMLDocument2 )return;

HRESULT hr;

CComPtr <IHTMLWindow2> spWin2; 
hr = pIHTMLDocument2->get_parentWindow(&spWin2); 
if(spWin2)
{
  //安装连接点.
  //事件接口ID: DIID_HTMLWindowEvents2
  CDHTMLEventSink *pDHTMLEventSink = new CDHTMLEventSink();
pDHTMLEventSink->SetHtmlWindow2(spWin2);
if(!pDHTMLEventSink->AdviseSink())
{
  //如果安装连接点失败,则删除接收器指针。
delete pDHTMLEventSink;
}
else
{
  //如果安装连接点成功,则保存接收器的指针。
m_aHtmlWin2EventSink.Add(pDHTMLEventSink);
}
}

CComPtr< IHTMLFramesCollection2 > spFramesCollection2;
pIHTMLDocument2->get_frames( &spFramesCollection2 );
if(!spFramesCollection2) return;

long nFrameCount=0;
hr = spFramesCollection2->get_length( &nFrameCount );
if ( FAILED ( hr ) || 0 == nFrameCount )
{
return;
}

for(long i=0; i<nFrameCount; i++)
{
CComVariant vDispWin2;
hr = spFramesCollection2->item( &CComVariant(i), &vDispWin2 );
if ( FAILED ( hr ) )continue;

CComQIPtr< IHTMLWindow2 > spWin2 = vDispWin2.pdispVal;
if( !spWin2 )continue;

CComPtr < IHTMLDocument2 > spDoc2;
spWin2->get_document( &spDoc2 );
EnumAllDocument( spDoc2);
  }
}


2. 事件接收器中onscroll的函数的代码如下:

void CDHTMLEventSink::OnScroll(IHTMLEventObj *pEvtObj)
{
if(!gpIESyncFrame->m_pStScrollPos)
{
gpIESyncFrame->m_pStScrollPos = new StScrollPos;
memset(gpIESyncFrame->m_pStScrollPos, 0x0, sizeof StScrollPos);
}

gpIESyncFrame->m_dwOldTimeScrollPos = GetTickCount();

CComPtr < IHTMLDocument2 > spDoc;
HRESULT hr = m_pHtmlWindow2->get_document(&spDoc); 
if(!spDoc) return;

CComPtr<IHTMLElement> spBody;
spDoc->get_body(&spBody);
if(!spBody) return;

//CComQIPtr<IHTMLTextContainer> spContainer = spBody;
//hr = pBody->QueryInterface(IID_IHTMLTextContainer,(void**)&spContainer);
//ASSERT(SUCCEEDED(hr));
//ASSERT( spContainer );

//CPoint ScrollPos;
//spContainer->get_scrollTop(&ScrollPos.y);
//spContainer->get_scrollLeft(&ScrollPos.x);


CComQIPtr<IHTMLElement2> spElement = spBody;
if(!spElement) return;

  //取得垂直滚动条的位置
long nTopPos;
spElement->get_scrollTop(&nTopPos);

  //取得水平滚动条的位置
long nLeftPos;
spElement->get_scrollLeft(&nLeftPos);

}



[解决办法]
脑袋晕,代码太长,
这样,你把它网页复制下来,先用js写个东东做测试能否得到,如果js里能得到,没有理由c++里得不到。
[解决办法]
是不是跟网页的结构有关系啊

热点排行