2011-05-26 47 views
3

在我的MFC應用程序中,我在CScrollView中逐行顯示文本。現在,新的要求是以html格式顯示文本(有時是圖像),保留所有效果,例如大膽,斜體等我知道我可以使用CHtmlView來顯示HTML文件,但我需要顯示文本存儲在內存中逐行。可能嗎?使用CHtmlView

感謝, 德米特里

回答

1

在內存字符串中生成HTML並將其插入到CHtmlView中是不可能的。

我們的解決方案(工作得很好)是生成臨時html文件(在Windows臨時目錄中)並將CHtml視圖導航到該文件。原則:

OurTempFileClass theTempFile; 
theTempFile.GetStream()->Put(mHTMLString.Get(), mHTMLString.GetLength()); 

CHtmlCtrl theHtmlCtrl; 
theHtmlCtrl.Navigate2(theTempFile->GetFullPath()); 

(這是僞代碼的原因,我們不使用STDLIB C++類

+0

非常感謝您的回答。我有一個現有的應用程序,它的視圖是從CScrollView派生的。是否有可能將其轉換爲使用CHtmlView in代替?我用CScrollView替換了基類,並且有void CBookView::OnDraw(CDC* pDC) { Navigate2("C:\\Shared\\Monte\\mp3Text\\13.html"); }但是沒有顯示。 – dpreznik 2011-05-27 12:41:06

+0

我不完全得到繼承關係,但我不認爲你應該在自己的OnDraw()函數中調用Navigate()函數。如果您重寫OnDraw(),則應該顯示的所有內容都需要在此函數中發生。在這種情況下,CHtmlView :: OnDraw函數(呈現HTML內容)從不使用,因爲您用自己的OnDraw函數替換了它。 – spassig 2011-05-27 14:16:04

+0

但是除了我自己指定的內容之外還應該顯示哪些內容? 在遷移到CHtmlView之前,我總是在自己的OnDraw()中使用TextOut()。 我決定創建一個基於CHtmlView的新應用程序,如果它改變我現有的應用程序太麻煩了。但是我不知道從哪裏調用Navigate2()。在我發現它從OnInitialUpdate()中調用的示例中,但我想根據打開的文檔動態顯示內容。你能告訴我我該怎麼做嗎? – dpreznik 2011-05-27 14:36:08

2

我們做這樣的事情對我們的日誌。

我們只保留一個「活的」html文檔並追加到它並重新顯示它到html視圖。

爲了我們自己的目的,我們已經實現了一個小的自定義html生成器來添加項目到html。

您可以將字符串發送到HTML文檔的東西,如:

IHTMLDocument2 *document = GetDocument(); 
    if (document != NULL) 
    { 

     // construct text to be written to browser as SAFEARRAY 
     SAFEARRAY *safe_array = SafeArrayCreateVector(VT_VARIANT,0,1); 

     VARIANT *variant; 
     // string contains the HTML data. 
     // convert char* string to OLEstring 

     CComBSTR bstrTmp = string; 

     SafeArrayAccessData(safe_array,(LPVOID *)&variant); 
     variant->vt = VT_BSTR; 
     variant->bstrVal = bstrTmp; 
     SafeArrayUnaccessData(safe_array); 

     // write SAFEARRAY to browser document to append string 
     document->write(safe_array); 

     //Detach CComBSTR since string will be freed by SafeArrayDestroy 
     bstrTmp.Detach(); 

     //free safe_array 
     SafeArrayDestroy(safe_array); 

     //release document 
     document->Release(); 
    } 

最大。

0

該解決方案是非常簡單的

等待文件加載到超載OnDocumentComplete功能

完成。
CHtmlView::OnDocumentComplete(LPCTSTR lpszURL) 
{ 

IHTMLDocument2 *document = GetDocument(); 

IHTMLElement* pBody = document->get_body(); 

BSTR str = "your HTML"; 

pBody-> put_innerHTML(str); 

document->close(); 
document->Release(); 
} 
+0

它真的回答了這個問題嗎? – user1 2015-01-05 10:11:08

+0

是的。要求是使用CHtmlView在內存中顯示HTML,並且可以在字符串「BSTR str」中加載HTML以顯示在CHtmlView上 – Chebyr 2015-01-05 10:21:30