我的思路是把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控件上
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控件上
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();
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滚动条外观,否则的话,剪切掉了滚动条的区域,你又如何绘制上去。
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();
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准备结了,各位到这里领分吧