CHtmlView_SearchView.cpp
上传用户:csjhqyl
上传日期:2013-08-06
资源大小:22k
文件大小:8k
源码类别:
PlugIns编程
开发平台:
Visual C++
- // CHtmlView_SearchView.cpp : implementation of the CCHtmlView_SearchView class
- //
- #include "stdafx.h"
- #include "CHtmlView_Search.h"
- #include "CHtmlView_SearchDoc.h"
- #include "CHtmlView_SearchView.h"
- #include <Mshtml.h>
- #include <atlbase.h>
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView
- IMPLEMENT_DYNCREATE(CCHtmlView_SearchView, CHtmlView)
- BEGIN_MESSAGE_MAP(CCHtmlView_SearchView, CHtmlView)
- //{{AFX_MSG_MAP(CCHtmlView_SearchView)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- // DO NOT EDIT what you see in these blocks of generated code!
- //}}AFX_MSG_MAP
- // Standard printing commands
- ON_COMMAND(ID_FILE_PRINT, CHtmlView::OnFilePrint)
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView construction/destruction
- CCHtmlView_SearchView::CCHtmlView_SearchView()
- {
- // TODO: add construction code here
- }
- CCHtmlView_SearchView::~CCHtmlView_SearchView()
- {
- }
- BOOL CCHtmlView_SearchView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- return CHtmlView::PreCreateWindow(cs);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView drawing
- void CCHtmlView_SearchView::OnDraw(CDC* pDC)
- {
- CCHtmlView_SearchDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // TODO: add draw code for native data here
- }
- void CCHtmlView_SearchView::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.codeproject.com"),NULL,NULL);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView printing
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView diagnostics
- #ifdef _DEBUG
- void CCHtmlView_SearchView::AssertValid() const
- {
- CHtmlView::AssertValid();
- }
- void CCHtmlView_SearchView::Dump(CDumpContext& dc) const
- {
- CHtmlView::Dump(dc);
- }
- CCHtmlView_SearchDoc* CCHtmlView_SearchView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCHtmlView_SearchDoc)));
- return (CCHtmlView_SearchDoc*)m_pDocument;
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CCHtmlView_SearchView message handlers
- void CCHtmlView_SearchView::FindText(CString searchText, long lFlags /* =2 */, BOOL bNNF /* =FALSE (for internal use)*/)
- {
- static CString sLastSearch;
- static BSTR lastBookmark = NULL;
- if(sLastSearch != searchText)
- lastBookmark = NULL;
- sLastSearch = searchText;
- IHTMLDocument2 *lpHtmlDocument = NULL;
- LPDISPATCH lpDispatch = NULL;
- lpDispatch = GetHtmlDocument();
- ASSERT(lpDispatch);
- lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
- ASSERT(lpHtmlDocument);
- lpDispatch->Release();
- IHTMLElement *lpBodyElm;
- IHTMLBodyElement *lpBody;
- IHTMLTxtRange *lpTxtRange;
- lpHtmlDocument->get_body(&lpBodyElm);
- ASSERT(lpBodyElm);
- lpHtmlDocument->Release();
- lpBodyElm->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody);
- ASSERT(lpBody);
- lpBodyElm->Release();
- lpBody->createTextRange(&lpTxtRange);
- ASSERT(lpTxtRange);
- lpBody->Release();
- CComBSTR search(searchText.GetLength()+1,(LPCTSTR)searchText);
- bool bFound,bTest;
- long t;
- if(lastBookmark!=NULL)
- {
- lpTxtRange->moveToBookmark(lastBookmark,(VARIANT_BOOL*)&bTest);
- if(!bTest)
- {
- lastBookmark=NULL;
- lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),1,&t);
- lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
- } else
- {
- lpTxtRange->moveStart((BSTR)CComBSTR("Character"),1,&t);
- lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
- }
- } else
- {
- lpTxtRange->moveStart((BSTR)CComBSTR("Textedit"),0,&t);
- lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
- }
- lpTxtRange->findText((BSTR)search,0,lFlags,(VARIANT_BOOL*)&bFound);
- if(!bFound)
- {
- if(lastBookmark==NULL && !bNNF)
- {
- CString message;
- message.Format("Cannot find the string: '%s'",searchText);
- AfxMessageBox(message);
- } else if(lastBookmark!=NULL)
- {
- lastBookmark = NULL;
- FindText(searchText,lFlags,TRUE);
- }
- } else
- {
- if(lpTxtRange->getBookmark(&lastBookmark)!=S_OK)
- lastBookmark=NULL;
- lpTxtRange->select();
- lpTxtRange->scrollIntoView(TRUE);
- }
- lpTxtRange->Release();
- }
- void CCHtmlView_SearchView::FindText2(CString searchText, long lFlags /* =2 */, CString matchStyle, CString searchID)
- {
- ClearSearchResults(searchID);
- IHTMLDocument2 *lpHtmlDocument = NULL;
- LPDISPATCH lpDispatch = NULL;
- lpDispatch = GetHtmlDocument();
- ASSERT(lpDispatch);
- lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
- ASSERT(lpHtmlDocument);
- lpDispatch->Release();
- IHTMLElement *lpBodyElm;
- IHTMLBodyElement *lpBody;
- IHTMLTxtRange *lpTxtRange;
- lpHtmlDocument->get_body(&lpBodyElm);
- ASSERT(lpBodyElm);
- lpHtmlDocument->Release();
- lpBodyElm->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody);
- ASSERT(lpBody);
- lpBodyElm->Release();
- lpBody->createTextRange(&lpTxtRange);
- ASSERT(lpTxtRange);
- lpBody->Release();
- CComBSTR html;
- CComBSTR newhtml;
- CComBSTR search(searchText.GetLength()+1,(LPCTSTR)searchText);
- long t;
- bool bFound;
- while(lpTxtRange->findText(search,0,lFlags,(VARIANT_BOOL*)&bFound),bFound)
- {
- newhtml.Empty();
- lpTxtRange->get_htmlText(&html);
- newhtml.Append("<span id='");
- newhtml.Append((LPCTSTR)searchID);
- newhtml.Append("' style='");
- newhtml.Append((LPCTSTR)matchStyle);
- newhtml.Append("'>");
- if(searchText==" ")
- newhtml.Append(" "); // doesn't work very well, but prevents (some) shit
- else
- newhtml.AppendBSTR(html);
- newhtml.Append("</span>");
- lpTxtRange->pasteHTML(newhtml);
- lpTxtRange->moveStart((BSTR)CComBSTR("Character"),1,&t);
- lpTxtRange->moveEnd((BSTR)CComBSTR("Textedit"),1,&t);
- }
- lpTxtRange->Release();
- }
- void CCHtmlView_SearchView::ClearSearchResults(CString searchID)
- {
- CComBSTR testid(searchID.GetLength()+1,searchID);
- CComBSTR testtag(5,"SPAN");
- IHTMLDocument2 *lpHtmlDocument = NULL;
- LPDISPATCH lpDispatch = NULL;
- lpDispatch = GetHtmlDocument();
- ASSERT(lpDispatch);
- lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
- ASSERT(lpHtmlDocument);
- lpDispatch->Release();
- IHTMLElementCollection *lpAllElements;
- lpHtmlDocument->get_all(&lpAllElements);
- ASSERT(lpAllElements);
- lpHtmlDocument->Release();
- IUnknown *lpUnk;
- IEnumVARIANT *lpNewEnum;
- if (SUCCEEDED(lpAllElements->get__newEnum(&lpUnk)) && lpUnk != NULL)
- {
- lpUnk->QueryInterface(IID_IEnumVARIANT,(void**)&lpNewEnum);
- ASSERT(lpNewEnum);
- VARIANT varElement;
- IHTMLElement *lpElement;
- while (lpNewEnum->Next(1, &varElement, NULL) == S_OK)
- {
- _ASSERTE(varElement.vt == VT_DISPATCH);
- varElement.pdispVal->QueryInterface(IID_IHTMLElement,(void**)&lpElement);
- ASSERT(lpElement);
- if (lpElement)
- {
- CComBSTR id;
- CComBSTR tag;
- lpElement->get_id(&id);
- lpElement->get_tagName(&tag);
- if((id==testid)&&(tag==testtag))
- {
- BSTR innerText;
- lpElement->get_innerHTML(&innerText);
- lpElement->put_outerHTML(innerText);
- }
- }
- VariantClear(&varElement);
- }
- }
- }