我的思路是把IE控件的窗口垂直滚动条裁剪掉,用一个静态控件覆盖并绘制成滚动条样式,现在的问题是如何得到当前滑块滚动位置的信息,我子类化IE控件窗口的窗口过程,在WM_MOUSEWHEEL,WM_VSCROLL消息里GetScrollInfo或者GetScrollBarInfo得到的信息全是0 
void CSkinScrollBar::SkinWindow(HWND hWnd/*IE控件窗口的窗口句柄*/)
{    assert(hWnd!=NULL);    SetProp(hWnd, (_T("SkinScrollBar")), this);
    OldProc = (WNDPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewWndProc);}DWORD CALLBACK CSkinScrollBar::NewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{    CSkinScrollBar *pThis = (CSkinScrollBar*)GetProp(hwnd,_T("SkinScrollBar"));    LRESULT lResult = CallWindowProc(OldProc,hwnd,message,wParam,lParam);  // 先交由默认窗口过程处理    if (pThis==NULL)
    {
        return  lResult;
    }    static SCROLLINFO si;
    static SCROLLBARINFO sbi;
    switch (message)
    {
    case WM_MOUSEWHEEL:
        {
 
            ZeroMemory(&sbi, sizeof(SCROLLBARINFO));
            GetScrollBarInfo(hwnd,OBJID_VSCROLL,&sbi);            si.cbSize=sizeof(si);
            si.fMask=SIF_ALL;
            GetScrollInfo(hwnd,SB_VERT,&si); // 调试发现:这里得到的信息全是0
        }
        break;
    case WM_VSCROLL:
        {
            si.cbSize=sizeof(si);
            si.fMask=SIF_ALL;
            GetScrollInfo(hwnd,SB_VERT,&si);        }
    case WM_HSCROLL:
        {        }
        break;
    }    return lResult;
}请高人指点如何得到IE滚动条滑块信息以及自绘滚动条的信息如何反馈到IE控件上

解决方案 »

  1.   

    你应该用dhtmldoc,先得到webbrowase然后得到doc再得到scrobar再得到相关信息。
      

  2.   

    这个东西你非要自己绘制会累死的,我建议你通过接口把里面的 Web 页面上的滚动条用 CSS 控制为和你想要绘制的效果一样。个人感觉这是最简单的。
      

  3.   

    楼上的大哥,你的方法不错,你的这个方法如何实现呢?我对CSS这方面不太熟悉
      

  4.   

    在获取IE滚动条位置时,需要作判断,不能直接获取。这个问题俺曾在VB版里回答过。
      

  5.   

    请教楼上的老兄,在VC下我用下面的代码总是取不到,要么总是0,要么总是个很大的负数:
    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;

    // 从body获得IHTMLElement2接口指针,用以访问滚动条 
    IHTMLElement2 *pElement = NULL; 
    hr = pBody->QueryInterface(IID_IHTMLElement,(void**)&pElement); 
    assert(SUCCEEDED(hr)); 
    assert( pElement ); pElement->get_scrollTop(&top); TRACE(_T(" get_offsetTop %d\n"),top); pElement->Release();
    pBody->Release(); 
    pDocument->Release(); 
    pdisp->Release();
      

  6.   

    NND,接口ID写错了,应该是IID_IHTMLElement2
      

  7.   

    俺在VB里是这样获得滚动条位置的:
        Dim nTop As Long, nLeft As Long     If Me.WebBrowser1.Document.compatMode <> "BackCompat" Then 
            nTop = Me.WebBrowser1.Document.documentElement.scrollTop 
            nLeft = Me.WebBrowser1.Document.documentElement.scrollLeft 
        Else         nTop = Me.WebBrowser1.Document.body.scrollTop 
            nLeft = Me.WebBrowser1.Document.body.scrollLeft 
        End If 
    LZ也可以转换一下思路,用VC动态生成JavaScript脚本来设置IE滚动条外观,否则的话,剪切掉了滚动条的区域,你又如何绘制上去。
      

  8.   

    我用www.hao123.com的网页来测试,下面的代码在滚动条事件产生时可以得到滑块的位置,但是我换成我们自己的网页就得到的全是0,无论滚轮和网页怎么滚动,这跟网页有什么关系么?还望高人指点
    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;
    // 从body获得IHTMLElement2接口指针,用以访问滚动条 
    IHTMLElement2 *pElement = NULL; 
    hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement); 
    assert(SUCCEEDED(hr)); 
    assert( pElement );

    IHTMLTextContainer  *pCont;  
    pBody->QueryInterface(IID_IHTMLTextContainer,(LPVOID*)(&pCont)); 
    assert(pCont);  
    // 获得滚动条位置,从顶端开始 
    long scroll_top; 
    pCont->get_scrollTop( &scroll_top ); TRACE(_T(" 垂直滚动条滑块当前位置%d\n"),scroll_top); // 滑块相对于top 的虚拟位置,如果是我们的网页,这值总是0 m_pScrollBar->UpdataThumbPos(scroll_top); pElement->Release();
    pBody->Release();
    pCont->Release();
    pDocument->Release(); 
    pdisp->Release();
      

  9.   


    to lyserver:你的这段代码转成VC是什么样子呢? If Me.WebBrowser1.Document.compatMode <> "BackCompat" Then  这里是否判断向后兼容的意思?我在IE接口咋找不到这样的属性呢? 现在就差一点点了,就是如果网页采用web标准后就取不到滚动条信息,也就是文件开头处多了下面的段:
    <!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>
    ...要不是能取到的,怎么解决这样的情况呢?该问题的扩展:http://topic.csdn.net/u/20081027/14/274bec64-9c24-4375-9c3d-a7bb644844aa.html准备结了,各位到这里领分吧