任何让CWebBrower2控件动态加载html
在下文中,CHtmlView派生的控件可以动态的加载html内容,不用先写到文件中再显示,而是在代码中存放编辑html语句
http://www.codeproject.com/miscctrl/htmlctrlsample.asp
中:
void CHTMLSampleDlg::OnButton1()
{
CString csHTML = "";
m_iCounter++;
// Preparing the HTML page to be shown...
csHTML.Format("<html><body bgcolor=\"7AA1E6\" "
"leftmargin=\"0\" topmargin=\"0\" rightmargin=\"0\" bottommargin=\"0\" oncontextmenu=\"return false\"><table width=\"100%%\" bgcolor=\"7AA1E6\" align=\"left\" cellspacing=\"6\"><tr><td bgcolor=\"D6DFF7\" bordercolor=\"#FFFFFF\"><table width=\"100%%\"><tr><td bgcolor=\"#FFFFFF\"><img src=\"rang.png\" width=\"16\" height=\"16\"> Actual value</td></tr><tr><td><font size=\"2\">Now the value is: <b>%i</b>.</font></td></tr></table></td></tr></table></body></html>",
m_iCounter);
this->m_cHTML.SetNewHTMLContent(csHTML,true);
}
我想请教的是:CWebBrower2可不可以也实现这样的功能
谢谢
问题点数:200、回复次数:7Top
1 楼myy()回复于 2005-11-12 22:58:29 得分 10
这是BCB的代码,关键部分通用,参考一下吧:
std::auto_ptr<TStringList> ss (new TStringList());
ss->LoadFromFile(AppPath+"html\\List.htm");
AnsiString s=ss->Text;
CComQIPtr<IPersistStreamInit, &IID_IPersistStreamInit> iPssi(wb->Document);
if(iPssi==NULL)
return;
if(!SUCCEEDED(iPssi->InitNew()))
return;
IStream *istm = NULL;
HGLOBAL html = NULL;
try {
html=::GlobalAlloc( GPTR, s.Length()+1);
::GlobalLock(html);
CopyMemory(html, s.c_str(), s.Length());
if(!SUCCEEDED(CreateStreamOnHGlobal( html, false, &istm)))
return;
iPssi->Load(istm);
istm->Release();
}
__finally {
::GlobalUnlock(html);
::GlobalFree(html);
}
Top
2 楼myy()回复于 2005-11-12 23:02:15 得分 0
CComQIPtr<IPersistStreamInit, &IID_IPersistStreamInit> iPssi(wb->Document);
中的:
wb->Document 是获取IHTMLDocument2指针,CHtmlView也有同类方法
Top
3 楼yujia120(永不停息)回复于 2005-11-13 00:07:19 得分 0
http://www.codeproject.com/editctrl/HtmlEdit.asp
这个我也找到过,可是使用很复杂,我编译还没有通过,不知道引用什么库和头文件编译,
error C2065: 'IDM_IE50_PASTE' : undeclared identifier等等20个找不到定义Top
4 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-13 00:09:11 得分 140
IUnknown* pUnk = GetControlUnknown();
IWebBrowser2* pBrowser;
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &pBrowser);
CComPtr<IDispatch> pDisp;
hr = m_spWebBrowser2->get_Document(&pDisp);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML;
spHTML = pDisp;
hr = S_OK;
IHTMLElement *pBodyElement;
//get body element
hr=spHTML ->get_body( &pBodyElement);
//put content to body element
_bstr_t pbBody( csHTML);
hr=pBodyElement->put_innerHTML( pbBody);
if( hr==S_FALSE) return FALSE;
else return TRUE;
Top
5 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-11-13 00:10:44 得分 0
关键是得到IHTMLDocument2*指针,剩下的工作就差不多了Top
6 楼yujia120(永不停息)回复于 2005-11-14 13:54:32 得分 0
m_spWebBrowser2没有get_Document方法?是pBrower?怎么和m_spWebBrowser2关联?Top
7 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-11-14 16:00:16 得分 50
CWebBrower2?嗯,这玩意还是不要用的好,OLE操作比COM接口慢多了。
我一般直接用CWnd::CreateControl来创建WebBrowser控件的,这也是CHTMLView内部使用的方法。
IDM_IE50_PASTE找不到定义的话,去升级VCTop




