我想在加载完页面后自动把滚动条滚到最右边于是我用如下代码
void CBookLocal7View::HtmlOnClick(IHTMLEventObj *pEvtObj)
{
int i = 0;
}void CBookLocal7View::OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL)
{
CBookLocal7Doc* pDoc = GetDocument(); //webbrowser 控件在document中定义
IUnknown* pUnk;
LPDISPATCH lpWBDisp;
HRESULT hr;
IHTMLDocument2 *pDocument = NULL; pUnk = pDoc->m_WebBrows.GetControlUnknown();
ASSERT(pUnk); hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr)); if (lpDisp == lpWBDisp ) //主框架加载完成
{
long p; try
{
hr = lpWBDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument ); //获取失败pDocument为0
IHTMLElement *pBody = NULL;
hr = pDocument->get_body( &pBody );
IHTMLElement2 *pElement = NULL;
hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement);
pElement->get_scrollWidth(&p);
pElement->put_scrollLeft(p);
}catch(...){}
} lpWBDisp->Release();
}
void CBookLocal7View::HtmlOnClick(IHTMLEventObj *pEvtObj)
{
int i = 0;
}void CBookLocal7View::OnDocumentComplete(LPDISPATCH lpDisp,VARIANT FAR* URL)
{
CBookLocal7Doc* pDoc = GetDocument(); //webbrowser 控件在document中定义
IUnknown* pUnk;
LPDISPATCH lpWBDisp;
HRESULT hr;
IHTMLDocument2 *pDocument = NULL; pUnk = pDoc->m_WebBrows.GetControlUnknown();
ASSERT(pUnk); hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr)); if (lpDisp == lpWBDisp ) //主框架加载完成
{
long p; try
{
hr = lpWBDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument ); //获取失败pDocument为0
IHTMLElement *pBody = NULL;
hr = pDocument->get_body( &pBody );
IHTMLElement2 *pElement = NULL;
hr = pBody->QueryInterface(IID_IHTMLElement2,(void**)&pElement);
pElement->get_scrollWidth(&p);
pElement->put_scrollLeft(p);
}catch(...){}
} lpWBDisp->Release();
}
{
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pWeb;
CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
pWeb = pDisp;
pWeb->get_Document((IDispatch**)&pDoc2); if (m_ie.GetDocument() != pDoc2) return;
//pDoc2->......
}
但是我还是想不通啊
我原先是:从自定义的m_WebBrows获得IUnknown-->再获取LPDISPATCH-->和函数传递的LPDISPATCH进行比较,判断主框架是否加载完-->再从LPDISPATCH获取IHTMLDocument2而你是:把传递进来的LPDISPATCH 强制转化成IWebBrowser2-->然后在获取IHTMLDocument2我少了把LPDISPATCH 强制转化成IWebBrowser2的一步,可是我在很多情况下直接都可以从LPDISPATCH 取得IHTMLDocument2,在这为什么要强制转化呢???
你的lpWBDisp是LPDISPATCH类型:LPDISPATCH lpWBDisp;
它是浏览器对象的接口,所以它支持IWebBrowser2接口,而通过IWebBrowser2::get_Document才能得到MSHTML的接口IHTMLDocument2,所以lpWBDisp不支持IHTMLDocument2接口.