如何获得webBrowser控件滚动条滑块的位置问题补充

hurryboylqs 2008-10-27 02:46:23
我在OnDocumentComlete文档加载完毕时获得IHTMLWindow2接口 然后挂接他的HTMLWindowEvents2事件,自己实现了一个IDispatch
在Invoke里获得滚动事件,我用www.hao123.com来做测试,可以取到webBrowser控件滚动条滑块的位置,我自绘的滚动条也滚动得很好,可是我换了另外一个网页就取不到滑块位置信息了,滚动条事件是产生了的,但get_scrollTop得到的值总是0,这个是不是跟具体的网页有关呢?望高人指点,代码如下:



STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispparams, VARIANT * pVarResult, EXCEPINFO * pExcepInfo, UINT * puArgErr)
{


if (dispIdMember==1014) // 滚动条事件(1014是我调试得到的,有没有预先定义好的宏?)
{

HRESULT hr;
IDispatch *pdisp;
hr = WebBrowser1->get_Document(&pdisp);
assert( pdisp); //if NULL, we failed

// 获得Html文档指针
IHTMLDocument2 *pDocument = NULL;
hr = pdisp->QueryInterface( IID_IHTMLDocument2,(void**)&pDocument);
assert(SUCCEEDED( hr));
assert( pDocument );


IHTMLElement *pBody = NULL;
hr = pDocument->get_body(&pBody);
assert(SUCCEEDED(hr));
assert(pBody);

long top;

IHTMLTextContainer *pCont;
pBody->QueryInterface(IID_IHTMLTextContainer,(LPVOID*)(&pCont));
assert(pCont);

// 获得滚动条位置,从顶端开始
long scroll_top;
if(FAILED(pCont->get_scrollTop( &scroll_top )));

TRACE(_T(" 滚动条滑块的位置: %d\n"),scroll_top); //滑块相对于top 的位置

m_pScrollBar->UpdataThumbPos(scroll_top); // 更新滑块位置



pBody->Release();
pCont->Release();
pDocument->Release();
pdisp->Release();
}

return S_OK;
}
...全文
835 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jameshooo 2008-10-28
  • 打赏
  • 举报
回复
frameset页面通常是没有滚动条的,所以加了也没用,总不成控制frame吧,那样的话控制哪个frame呢?
hurryboylqs 2008-10-28
  • 打赏
  • 举报
回复
恩,我看了csdn的网页源代码,头部的内容跟我们的网页一样,jameshooo兄,若是frameset类型的网页要怎么取呢?应该有办法的吧?我对网页方面的知识了解的不是很多
hurryboylqs 2008-10-28
  • 打赏
  • 举报
回复
现在页面全是frameset的,微软的IE接口咋这么漏呢?居然取不到,在非frameset情况下 我上面的代码能很好的工作
Amuro1987218 2008-10-28
  • 打赏
  • 举报
回复
另外,在非frameset情况下,用oleacc.dll提供的AccessibleObjectFromWindow msaa api取得ie最深层窗口的 IAccessable对象,它的序号为1的子对象就是document,可以认为这个document在浏览器窗口视图内被拉动,根据由IAccessible::accLocation取得的位置进行粗略估算进度(大概算出来误差在1%以下),但在有frameset存在的情况下无效。
Amuro1987218 2008-10-28
  • 打赏
  • 举报
回复
枚举每个frame,得到IHTMLWindow2 (躲过跨域问题)在得到IHTMLDocument2后原样导航应可以得到这个top值,但在web标准使用后仍得到0而已。

如果滚动条样式并不复杂,可以考虑通过调用每个body的IHTMLStyle3的put_scrollbarBaseColor等方法,用改变默认颜色的方法勉强实现定制滚动条
jameshooo 2008-10-27
  • 打赏
  • 举报
回复
如果网页使用了frameset的话上面的做法可能失效,原因有两个:
1、frameset中的body元素是虚拟的,或者说是不存在的
2、frameset类型的网页通常没有滚动条,能滚动的多是里面的各个frame,就像CSDN论坛的页面一样,左右各一个frame,各自独立滚动,但是根文档没有滚动条
liumeiqinyang 2008-10-27
  • 打赏
  • 举报
回复
不支持?那该如何解决呢?
[Quote=引用 1 楼 Amuro1987218 的回复:]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

用了web标准就取不到的
[/Quote]
hurryboylqs 2008-10-27
  • 打赏
  • 举报
回复
我看了一下他网页的源代码,头部确实有这样的一段:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh" xml:lang="zh">
<head>
...
hurryboylqs 2008-10-27
  • 打赏
  • 举报
回复
那要怎么取呢?请教了
Amuro1987218 2008-10-27
  • 打赏
  • 举报
回复
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

用了web标准就取不到的

15,980

社区成员

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

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