65.9K
CodeProject is changing. Read more.
Home

Find in CWebBrowser Control

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1 vote)

Jun 29, 2000

viewsIcon

160784

How to display the "Find" window in a CWebBrowser control.

Introduction

An application that I had been assigned to write, required me to display reports that could possibly be over 10,000 lines in a CWebBrowser control. These 10,000 lines sometimes took a matter of hours to produce, so it was decided that it would be nice to display the report as it was generated, line by line. Being reasonably new to COM, I posted the question "How?" in the CodeProject message area. Along came Colin Davies, with a bit a code. In a 10,000 line report, it can take the user a lllloooonnnngggg time to find what they are looking for!

IE5 has the Edit - Find (on this page)... CTRL+F option that searches the current page. So I investigated implementing this in my CWebBrowser control, and found it was not as easy as it had first sounded to a COM newbie. Anyway after searching some rather confusing MSDN articles I hacked some code to produce this code slice, which can also be modified to display the View Source and Options windows as well.

Source listing

#include <initguid.h>
DEFINE_GUID(CGID_IWebBrowser,0xED016940L,
            0xBD5B,0x11cf,0xBA, 0x4E,0x00,
            0xC0,0x4F,0xD7,0x08,0x16);

//1 : FIND, 2: VIEWSOURCE, 3 : OPTIONS
DWORD nCmdID = 1; 

LPDISPATCH lpDispatch = NULL;
LPOLECOMMANDTARGET lpOleCommandTarget = NULL;

//m_htmlview is the member variable 
//for the CWebBrowser2 control.

lpDispatch = m_htmlview.GetDocument();
ASSERT(lpDispatch);

// Get an IDispatch pointer for the 
// IOleCommandTarget interface.
lpDispatch->QueryInterface(
        IID_IOleCommandTarget,
        (void**)&lpOleCommandTarget);
ASSERT(lpOleCommandTarget);

lpDispatch->Release();

// Invoke the given command id for 
// the WebBrowser control
lpOleCommandTarget->Exec(
        &CGID_IWebBrowser, nCmdID, 0,
        NULL, NULL);

// Release the command target
lpOleCommandTarget->Release();