基于IE内核浏览器控件,自定义高亮查找

实现浏览器自定义查找功能,参见开源项目:http://www.ookii.org/Software/FindAsYouType,在此贴出相关核心代码。


BOOL LbWebNoteHandler::DoHighlightText( const CString& strText , CComPtr<IHTMLTxtRange>& pTxtRange , CComPtr<IHTMLDocument2>& pDoc )
{
    BSTR pStr = strText.AllocSysString();
    
    long t = 0; long findflag = 0 | 4; // 向下搜索、匹配大小写
    VARIANT_BOOL bFound = FALSE; BOOL bFristFind = TRUE;
    while ( pTxtRange->findText( pStr , 0 , findflag , &bFound) , bFound )
    {
        CComPtr<IHTMLElement> pElement = NULL;
        HRESULT hr = pTxtRange->parentElement( &pElement );
        if ( FAILED( hr ) || pElement == NULL  )
            break ;
        
        if ( CheckVisible(pElement) ) // 忽略不可见元素
        {
            HighlightRange( pTxtRange , pDoc );
        }
        
        pTxtRange->moveStart( (BSTR)CComBSTR( _T("Character") ) , 1, &t );
        pTxtRange->moveEnd( (BSTR)CComBSTR( _T("Textedit") ) , 1 , &t );


    }   
    
    SysFreeString( pStr );
    
    return TRUE;
}

BOOL LbWebNoteHandler::HighlightRange( CComPtr<IHTMLTxtRange>& pTxtRange , CComPtr<IHTMLDocument2>& pDoc )
{
    CComPtr<IMarkupServices> markup = NULL;
    CComPtr<IMarkupPointer> start = NULL;
    CComPtr<IMarkupPointer> end = NULL;


    HRESULT hr = pDoc->QueryInterface( __uuidof(IMarkupServices) , (void**)&markup );
    if ( FAILED( hr ) || markup == NULL  )
        return FALSE ;


    hr = markup->CreateMarkupPointer( &start );
    if ( FAILED( hr ) || start == NULL  )
        return FALSE ;


    hr = markup->CreateMarkupPointer( &end );
    if ( FAILED( hr ) || end == NULL  )
        return FALSE ;


    hr = markup->MovePointersToRange( pTxtRange , start , end );
    if ( FAILED( hr ) )
        return FALSE ;
    
    // Get display pointers from the markup pointers
    CComPtr<IDisplayPointer> displayStart = CreateDisplayPointer(pDoc, start);
    CComPtr<IDisplayPointer> displayEnd = CreateDisplayPointer(pDoc, end);
    if( displayStart == NULL || displayEnd == NULL )
        return FALSE;


    CComPtr<IHTMLDocument4> doc = NULL;
    doc = pDoc;
    
    CComPtr<IHTMLRenderStyle> style = NULL;
    hr = doc->createRenderStyle( NULL , &style );
    if ( FAILED( hr ) || style == NULL  )
        return FALSE ;


    style->put_defaultTextSelection( _bstr_t("false") );
    style->put_textBackgroundColor( _variant_t("#FFFF11") );
    style->put_textColor( _variant_t("#686868") );


    // Create a highlight segment to highlight the range
    CComPtr<IHighlightRenderingServices> highlight = NULL;
    hr = pDoc->QueryInterface( __uuidof(IHighlightRenderingServices) , (void**)&highlight );
    if ( FAILED( hr ) || highlight == NULL  )
        return FALSE ;
    
    CComPtr<IHighlightSegment> segment = NULL;
    hr = highlight->AddSegment(displayStart,displayEnd,style,&segment);
    if ( FAILED( hr ) || segment == NULL  )
        return FALSE ;


    // Store the segment so we can un-highlight it later.
    m_highlights.push_back(segment);


    return TRUE;
}


CComPtr<IDisplayPointer> LbWebNoteHandler::CreateDisplayPointer( CComPtr<IHTMLDocument2>& pDoc , CComPtr<IMarkupPointer>& markupPointer )
{
    CComPtr<IDisplayServices> display = NULL;
    HRESULT hr = pDoc->QueryInterface( __uuidof(IDisplayServices) , (void**)&display );
    if ( FAILED( hr ) || display == NULL  )
        return NULL ;


    CComPtr<IDisplayPointer> displayPointer = NULL;
    hr = display->CreateDisplayPointer( &displayPointer );
    if ( FAILED( hr ) || displayPointer == NULL  )
        return NULL ;


    hr = displayPointer->MoveToMarkupPointer( markupPointer , NULL );
    if ( FAILED( hr ) )
        return NULL ;
    
    return displayPointer;
}


BOOL LbWebNoteHandler::CancleHighlight( void )
{   
    if( m_highlights.empty() )
        return TRUE;


    CComPtr<IHTMLDocument2> pDoc = m_pIEWebBrowserRef->GetHTMLDocument2();
    if( pDoc == NULL )
        return FALSE;


    CComPtr<IHighlightRenderingServices> highlight = NULL;
    HRESULT hr = pDoc->QueryInterface( __uuidof(IHighlightRenderingServices) , (void**)&highlight );
    if ( FAILED( hr ) || highlight == NULL  )
        return FALSE;


    typedef std::vector<CComPtr<IHighlightSegment> >::iterator SegmentListIterator;


    for( SegmentListIterator segment = m_highlights.begin(); segment != m_highlights.end(); ++segment )
        highlight->RemoveSegment( *segment );
    m_highlights.clear();
    
    return TRUE;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
Java调用IE内核浏览器常用的方法是通过使用JavaFX Webview组件来实现。 JavaFX是Java平台的一部分,它提供了一套用于构建富应用程序的图形界面工具包。其中的Webview组件可以嵌入Web内容,包括HTML、CSS、JavaScript等,实现浏览器的功能。 下面是一个简单的示例代码,演示如何在Java中调用IE内核浏览器: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.web.WebView; import javafx.stage.Stage; public class WebViewTest extends Application { @Override public void start(Stage primaryStage) { // 创建JavaFX的Webview组件 WebView webView = new WebView(); // 设置WebView的属性,使用IE内核 System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); System.setProperty("webfx.forceHardwareAccel", "false"); // 加载指定的URL webView.getEngine().load("http://www.example.com"); // 创建一个场景,并将Webview加入其中 Scene scene = new Scene(webView, 800, 600); // 设置舞台的场景,并显示舞台 primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 在上述代码中,我创建了一个JavaFX的应用程序,并在其中使用Webview组件来加载指定的URL。通过设置`sun.net.http.allowRestrictedHeaders`和`webfx.forceHardwareAccel`系统属性,可以强制使用IE内核。最后,创建场景并将Webview加入其中,并设置舞台的场景并显示舞台。 需要注意的是,IE内核的具体版本取决于计算机上安装的IE版本。在使用Java调用IE内核浏览器时,需要确认计算机上已安装了IE,并设置相应的系统属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值