取得IE浏览器页面的滚动条位置(奇怪的现象)

liutian32 2007-12-10 09:57:24
我通过遍历,给网页内的所有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);

}

...全文
417 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiexie8682 2007-12-25
  • 打赏
  • 举报
回复
是不是跟网页的结构有关系啊
liutian32 2007-12-24
  • 打赏
  • 举报
回复
1.不好意思,提供的代码确实很乱.其实主要的代码为下面的部分, 就是在onscroll事件函数中取得滚动条的位置.

void CDHTMLEventSink::OnScroll(IHTMLEventObj *pEvtObj)
{
//取得文档接口指针
CComPtr<IHTMLDocument2> spDoc;
HRESULT hr = m_pHtmlWindow2->get_document(&spDoc);
if(!spDoc) return;

//从文档接口指针取得Body指针
CComPtr<IHTMLElement> spBody;
spDoc->get_body(&spBody);
if(!spBody) return;

//取得IHTMLElement2接口
CComQIPtr<IHTMLElement2> spElement = spBody;
if(!spElement) return;

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

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

TRACE("LEFT = %d, TOP = %d\n", nLeftPos, nTopPos);

}

当滚动条滚动的时候, 上面的函数就会被调用. 问题出在取得滚动条位置的代码部分, 对于有些网页可以正确取得其滚动条的位置,而有些取得的值则始终为0.

2. 谢谢杜兄,我先照你说的试试看.
eduyu 2007-12-18
  • 打赏
  • 举报
回复
脑袋晕,代码太长,
这样,你把它网页复制下来,先用js写个东东做测试能否得到,如果js里能得到,没有理由c++里得不到。

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧