Loading Simple HTML Pages From Memory

Environment: VC6 SP4, IE 5.0, Platform SDK.

Sometimes,when you use web browser control, it's not suitable to work with temporary files as a source for browser navigation. For example, if you want secure information or you need dynamically change content from c++ program.
CMoreHtml class derived from standard MFC-class CHtmlView and fully keeps class functionality. Additionally you will have some more abilities to work with html content. This class use standard COM interfaces IWebBrowser2, IHtmlDocument2. Moreover in this application uses IMarkupServices interface it force to minimum capability with IE 5.0.

Class usage

You could derive your own view from CMoreHtmlView like standard CHtmlView. If you want to activate work with memory, you need just call NavigateMemory() function like showed in example:

void CYourOwnView::OnInitialUpdate()
{
 CHtmlView::OnInitialUpdate();

 // TODO: This code navigates to a popular spot on the web.
 //  change the code to go where you'd like.
 //Navigate2(_T("http://www.microsoft.com/visualc/"),NULL,NULL);

 //initialize  navigation from memory mode
 NavigateMemory();
 
 //set parameters of html
 SetTitle( "Shakespeare page");
 PutBodyContent( (LPSTR)lpcstrContent);
 COleVariant ovBgColor( "cornsilk");
 SetBodyAttributes( "BGCOLOR", ovBgColor);
 SetScript( (LPSTR)lpcstrScript);
}

In any case, you need source for correct working of web browser control. Thereto, you can use html-file template from resource.

<HTML>
  <HEAD>
   <TITLE></TITLE>
   <SCRIPT>>/SCRIPT>
  </HEAD>
  <BODY>
  </BODY>
</HTML>

I can't find possibility to write to <HTML> or <HEAD> tag content, therefore I've created several functions, they write to exact parts of html document.

BOOL PutBodyContent( LPSTR lpstrContent) Write html content ( filling tag).
lpstrContent - text of HTML content;
BOOL SetBodyAttributes(CString sName, ColeVariant vValue) Setting tag attributes, like BGCOLOR, LINK etc.
sNname - attribute name;
vValue - attribute value(VARIANT type);
BOOL SetCharset(LPSTR lpstrCharset) Setting Charset.
BOOL SetScript(LPSTR lpstrScript) Write html scripts.
lpstrScript - content of <SCRIPT> tag;
BOOL SetTitle(LPSTR lpstrTitle) Set title of html document;

Uploading of html content possible only when downloading of html template finished. But you could use these functions in any place of code after running NavigateMemory(). Values of content store in CMoreHtmlView class members and apply in exact moment.

How CMoreHtmlView works.

NavigateMemory() function loads template html document from resource with identifier IDR_EMPTY_HTML and sets m_bMemoryMode to TRUE. PutBodyContent, SetScript etc. functions call IHtmlDocument2 methods only if document object exists, in other case functions only store content in private variables. If these functions execute with NULL parameter then content modification does from member variable values.
OnDownloadComplete function overloading makes for reloading html content if refresh browser command will be called.

Search and mark words in html document

Sometime you need make your own search system in application that uses web browser control. MarkWords member function you could use in that case. You only need to pass a search string as input parameter.

for( ; ;)
{	
 // Find text
 hr = pPtr1->FindText( poSearchStr, 0, pPtr2, NULL );

 if (hr == S_FALSE) // did not find the text
  break;

 IHTMLElement *pFontEl;
 
 // create FONT element with attributes for selection
 OLECHAR pchAttributes=0;
 hr=pMS->CreateElement(TAGID_FONT, 
 L"COLOR=white STYLE=\"backgroundcolor:darkblue\"", &pFontEl);
 
 // Insert created element to context
 hr=pMS->InsertElement( pFontEl, pPtr1, pPtr2);

// Continue searching
pPtr1->MoveToPointer( pPtr2);
}
It's main part of MarkWords function, at the beginning makes search of string after that creates <FONT COLOR=white STYLE="backgroundcolor:darkblue">...</FONT> element. This tag marks the located string.

Downloads

Download demo project and source - 29 Kb