超文本的高亮显示

原创 2002年04月23日 17:31:00

       不知道有没有朋友用过搜索引擎中的关键字高亮显示(Highlight功能),这种功能的实现很简单,但是效果却是很惊人的。


       首先,你要有一个IHTMLDocument2的接口指针,如果没有,你可以通过使用IWebBrowser2Ptr接口的get_Document方法得到一个IDispatch指针,然后通过它查询接口IID_IHTMLDocument2,就搞定了。(什么?你不知道怎么得到IWebBrowser2Ptr指针,OK,我也帮不了你了。)


       然后,通过IHTMLDocument2接口指针,我们可以查询得到IID_IMarkupContainer和IID_IMarkupServices接口的指针,然后使用IMarkupServices接口指针生成两个关键的接口指针IMarkupPointer(注意,是两个,为什么是两个呢?在超文本里查找Element,就好像三明治一样,要用两个指针夹着去找)。


       再然后,我们要把两个IMarkupPointer移到生成的IMarkupContainer上去,接着,我们就可以查找文本了,当然,之前,我们还要将文本生成适当的字符形式(稍后详细的代码中有说明),接着的事就简单了,生成一个Attribute的Element,然后利用IMarkupServices加到对象中去,再进行三明治的指针接力(后一个指针移到前一个指针的位置上去),查找下一段文本。


      再然后呢?(重复了吧,汗......),没有然后了,已经给文本上色了.......慢,我们只提到了上色,怎样把上的色(Element)去掉?好,你能想到这一点,说明你一定的编程实践经验了。那么,我们还是刚才的那段代码,只要使用IMarkupPointer的CurrentScope方法和IMarkupServices的RemoveElement方法组合,就能删掉添加的Element了。


      完了,这次是真的完了。


/*******************************************************************
* MarkWords(): Logic of whether set highlight text or clear it                             *
* parameter: sWord , the aid-Text for highlight                                                  *
* return:  TRUE if set success , else return FALSE                                             *
* DATE: 2002.3.5                                                                                           * *   TeddyWing                                                                                                * 
********************************************************************/
BOOL CBiglobeToolBar::SetMyColor(CString sWord, BOOL mFlag)
{
IHTMLDocument2   *   m_pHtmlDoc2;
IMarkupServices  *   pMS;
IMarkupContainer *   pMarkup;
IMarkupPointer   *   pPtr1, * pPtr2;
unsigned short * mSet = L"COLOR=#0000ff STYLE=/"background-color:#ff009c/""; // Font attribute


 if (0 == m_pBand->m_pIE) return FALSE;


 LPDISPATCH lpDispatch;
 HRESULT hr = m_pBand->m_pIE->get_Document(&lpDispatch);
    ASSERT(lpDispatch);
 
 hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&m_pHtmlDoc2);


    if (m_pHtmlDoc2)
 {
         hr = m_pHtmlDoc2->QueryInterface( IID_IMarkupContainer, (void **) & pMarkup );
         hr = m_pHtmlDoc2->QueryInterface( IID_IMarkupServices, (void **) & pMS );
 }
 else
   return FALSE;


    hr = pMS->CreateMarkupPointer( & pPtr1 );
    hr = pMS->CreateMarkupPointer( & pPtr2 );



    hr = pPtr1->SetGravity( POINTER_GRAVITY_Right );
 hr = pPtr2->SetGravity( POINTER_GRAVITY_Left );  
 
    hr = pPtr1->MoveToContainer( pMarkup, TRUE );
    hr = pPtr2->MoveToContainer( pMarkup, FALSE );



 int nFromLen = sWord.GetLength()+1;                  // Create aid-text
 OLECHAR * poSearchStr;
 poSearchStr = new OLECHAR[ nFromLen];     
 MultiByteToWideChar( CP_ACP, 0, sWord, -1, poSearchStr, nFromLen);


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


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


        IHTMLElement *pFontEl;


        if (TRUE == mFlag){
         hr = pMS->CreateElement(TAGID_FONT, mSet, &pFontEl); // create FONT element with attributes for selection
      hr = pMS->InsertElement( pFontEl, pPtr1, pPtr2);     // Insert created element to context
      pPtr1->MoveToPointer(pPtr2);                         // Continue searching
  }
  else{
            // Remove last created element in the context                                                      
   hr = pPtr1->CurrentScope( &pFontEl);
   hr = pMS->RemoveElement( pFontEl);
   pPtr1->MoveToPointer( pPtr2);                    // Continue searching   
  }
 }
 delete poSearchStr;


 return TRUE;
}

【Andoid杂谈】Android TextView中显示超文本(HTML)内容

主要在于html.fromHtml();方法的应用 以下是代码: package yyc.com.htmltextview; import android.graphics.drawable...
  • u011669081
  • u011669081
  • 2015年10月20日 19:43
  • 1304

Lucene学习之高亮显示

在搜索引擎中我们经常会看到这样的情景: 红色部分我们称之为高亮显示,lucene提供了HighLighter模块来实现这一功能。 高亮显示模块通常包含两个独立的功能,首先是动态拆分,就是从匹配...
  • u014449866
  • u014449866
  • 2015年05月19日 19:26
  • 1746

浅谈JavaScript实现关键字文本高亮显示

前端通常是指网站的表现层和结构层。因此前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,现在最新的高级版本HTML5、CSS3,以及SVG等。 ...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年04月15日 13:53
  • 1415

html5--文字高亮显示

代码实现: 1.建立demo.css /*** Styles for the Fokus demo page.* * @author Hakim El Hattab | http://hakim.se...
  • haoyunyun888
  • haoyunyun888
  • 2016年07月25日 20:13
  • 4509

一步一步跟我学习lucene(11)---lucene搜索之高亮显示highlighter

highlighter介绍 这几天一直加班,博客有三天没有更新了,望见谅;我们在做查询的时候,希望对我们自己的搜索结果与搜索内容相近的地方进行着重显示,就如下面的效果 这里我们搜索的内容是“一步一步跟...
  • wuyinggui10000
  • wuyinggui10000
  • 2015年05月22日 00:20
  • 4168

如何让页面里面的java代码高亮显示

syntaxhighlighter让页面上面的java代码高亮显示,也可以让textarea里面的代码高亮显示,这里只是指个方向,会一些很简单的用法,更多的功能还需要大家自己去研究...
  • bu123dian
  • bu123dian
  • 2016年03月23日 18:05
  • 1712

secureCRT中让vim高亮显示

SecureCRT中让vim高亮显示 linux的控制台颜色很好设置:Options ->Session Options -> Terminal -> Emulation 中Terminal选择ANS...
  • rooklyn21
  • rooklyn21
  • 2013年11月06日 16:52
  • 2540

textarea字符查找并且高亮显示,兼容Chrome,IE

function check() { var key=$("#k").val(); if(key=='') { $("#dvPop").hide(); } else { ...
  • rztyfx
  • rztyfx
  • 2017年03月13日 10:42
  • 1231

在word或者wps文档中让程序代码高亮显示

推荐使用。 前期准备 下载Notepad++。 http://notepad-plus.sourceforge.net/tw/site.htm 实现步骤 1. 使用Notepad++打开或编...
  • xiezhongtian
  • xiezhongtian
  • 2014年08月27日 12:26
  • 1533

高亮显示搜索到的关键字-jquery.highlight.js的用法!

高亮显示搜索到的关键字-jquery.highlight.js的用法!
  • sidongxue2
  • sidongxue2
  • 2015年04月08日 11:38
  • 5566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:超文本的高亮显示
举报原因:
原因补充:

(最多只允许输入30个字)