在C++中,如果想要通过编程方式控制一个WebBrowser控件中的网页滚动,可能会遇到一些挑战。传统的Windows滚动消息在这里并不适用,而且直接调用MFC的GetScrollInfo API也无法实现滚动。但是,通过IHTMLElement2接口,可以实现这一功能。虽然获取IHTMLElement2接口的方式可能有些隐晦,但一旦掌握了方法,就能够轻松地进行滚动操作。
首先,需要从WebBrowser控件获取文档的Dispatch接口。然后,通过这个接口,可以获取到IHTMLDocument2接口。接下来,可以从文档中获取到body元素,最后通过QueryInterface方法获取到IHTMLElement2接口。这样,就可以使用put_scrollTop和get_scrollTop方法来控制滚动了。
以下是一个示例代码,展示了如何实现这一过程:
HRESULT hr;
IDispatch *pDisp = m_browser.GetDocument();
ASSERT(pDisp);
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
ASSERT(SUCCEEDED(hr));
ASSERT(pDocument);
hr = pDocument->get_body(&pBody);
ASSERT(SUCCEEDED(hr));
ASSERT(pBody);
hr = pBody->QueryInterface(IID_IHTMLElement2, (void**)&pElement);
ASSERT(SUCCEEDED(hr));
ASSERT(pElement);
// 滚动到距离顶部100像素的位置
pElement->put_scrollTop(100);
// 获取整个页面的高度,但返回的数值可能不总是准确的,尤其是对于使用动态HTML的页面
long scroll_height;
pElement->get_scrollHeight(&scroll_height);
// 使用这个技巧来获取实际的滚动高度
long real_scroll_height;
pElement->put_scrollTop(20000000);
pElement->get_scrollTop(ℜ_scroll_height);
real_scroll_height += window_height;
// 打印到调试输出
TRACE("real scroll height: %ld, get_scrollHeight: %ld\n", real_scroll_height, scroll_height);
在上面的代码中,m_browser是WebBrowser控件的成员变量。首先,通过GetDocument方法获取到文档的Dispatch接口,然后通过QueryInterface获取到IHTMLDocument2接口。接着,通过get_body方法获取到body元素,并通过QueryInterface获取到IHTMLElement2接口。
然后,使用put_scrollTop方法将滚动条滚动到距离顶部100像素的位置。但是,直接使用get_scrollHeight方法获取到的页面高度可能并不准确,尤其是对于使用动态HTML的页面。因此,可以通过将滚动条滚动到一个非常远的位置,然后获取当前的滚动位置,再加上窗口的高度,来获取实际的滚动高度。
最后,将实际的滚动高度和get_scrollHeight方法获取到的高度打印到调试输出中,以便进行比较。