IE WebControl控件提供了顯示HTML的功能,但是只能夠顯示URL或者是文件。很多朋友都詢問關於顯示內存中HTML內容的方法,前幾天我在網上找到一段代碼,我在這裡進行一些講解。
思路:
先用WebControl顯示一個空的HTML文件(對於WebControl的用法有了解),然後利用接口IID_IHTMLDocument2,來重新設置Body標記內的InnerHTML屬性。(需要對DHTML有了解)
實現方法:
從CHTMLView派生新類CMoreHtmlView。
顯示空的HTML文件,可以直接利用Navigate2方法,你可以指定一個默認的HTML文件,不過WebControl還可以顯示定義在資源中的內容,根據Res
Protocol的定義,顯示使用資源中的數據時用下面的表示方法:
res://sFile[/sType]/sID
sFile:表示包含資源的文件
sType:資源的類型,例如RT_HTML或者你自己定義的資源類型,省略時為RT_HTML,
sID:資源ID
實例代碼
void CMoreHtmlView::NavigateMemory()
{
//get application name
CString sAppName=AfxGetAppName();
CString sResourseID;
//get resourse ID of Empty Html
sResourseID.Format("%d", IDR_EMPTY_HTML);
CString sNavigatePath;
//compile
sNavigatePath="res://"+sAppName+".exe/"+sResourseID;
Navigate2( sNavigatePath); //裝入資源中的HTML文件 此行實現功能
//Activate memory mode
m_bMemoryMode=TRUE;
}
修改Body標記內InnerHTML屬性。
實例代碼
BOOL CMoreHtmlView::PutBodyContent(LPSTR lpstrContent)
{
//store body content
if( lpstrContent) m_lpstrBodyContent=lpstrContent;
//check if HtmlDocument initialized
if( m_pHtmlDoc2) //m_pHtmlDoc2 指向接口 IID_IHTMLDocument2
{
HRESULT hr = S_OK;
IHTMLElement *pBodyElement;
//get body element
hr=m_pHtmlDoc2->get_body( &pBodyElement); //得到Body標記
//put content to body element
_bstr_t pbBody( m_lpstrBodyContent);
hr=pBodyElement->put_innerHTML( pbBody); //設置HTML標記內內容
if( hr==S_FALSE) return FALSE;
else return TRUE;
}
else return FALSE;
}
如何得到IHTMLDocument2
void CMoreHtmlView::OnDocumentComplete(LPCTSTR lpszURL)
{
// show html on first loading of document
if(m_bMemoryMode)
{
LPDISPATCH lpDispatch;
lpDispatch=GetHtmlDocument();
ASSERT(lpDispatch);
//get html document from IDispatch
HRESULT hr=lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&m_pHtmlDoc2);
//此行實現功能
if( SUCCEEDED(hr)) ShowMemoryHtml();
}
CHtmlView::OnDocumentComplete(lpszURL);
}
示范代碼的閱讀:
上面提到的三點是基本的方法,但是要閱讀我找到的這份代碼需要做一點特別的說明。關於IHTMLDocument2的獲得是在文件裝入結束後才查詢此接口。