无法将 Find 与 CHtmlView 和具有锚点的 URL 一起使用

Unable to use Find with CHtmlView and URLs that have anchors

我被这个难住了!

我有自己的 CHtmlView 衍生 class,我最近添加了对 Find 的支持。我是这样做的:

void CChristianLifeMinistryEditorDlg::OnEditFind()
{
    m_pHtmlPreview->ExecWB(OLECMDID_FIND, OLECMDEXECOPT_PROMPTUSER, nullptr, nullptr);
}

代码在后台执行以下操作:

HRESULT CChristianLifeMinistryHtmlView::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
{
    ASSERT(m_pBrowserApp != nullptr);

    const auto hr = m_pBrowserApp->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
    return hr;
}

它工作正常。但前提是我在浏览器控件中以这种方式呈现我的页面:

if (m_pHtmlPreview != nullptr)
{
    CString strURL = strPreviewXML;
    if (iBookmarkId != -1)
        strURL.Format(_T("%s#week%d"), (LPCTSTR)strPreviewXML, iBookmarkId);

    m_pHtmlPreview->Navigate2(strPreviewXML, 0, nullptr);
    //m_pHtmlPreview->Navigate2(strURL, 0, nullptr);
}

简而言之,如果我导航到 XML 文件本身,那么发现就有效了。但是,如果我尝试导航到同一个 XMl 文件,但使用我的锚点,当它显示在浏览器控件中的正确位置时,“查找”功能将无法运行:

我把它改回导航到的那一刻:

m_pHtmlPreview->Navigate2(strPreviewXML, 0, nullptr);

那么“查找”工具就可以正常工作了。但这意味着我无法再跳转到转换后的 HTML 输出的右侧部分。我尝试这样做:

m_pHtmlPreview->Navigate2(strPreviewXML, 0, nullptr);
m_pHtmlPreview->Navigate2(strURL, 0, nullptr);

我认为,如果我先导航到该页面,然后再导航到带有锚点的页面,那么 Find 就可以了。但是没有快乐。有什么办法吗?

当您尝试导航到 XML 文件时,Find 功能的机制似乎不喜欢它,该文件在 [=26] 中有一个书签=].

我已经有了将 XML 转换为 HTMl 的代码,因此我将其添加为次要步骤:

if (m_pHtmlPreview != nullptr)
{
    CString strURL = strPreviewXML;
    //if (iBookmarkId != -1)
    //  strURL.Format(_T("%s#week%d"), (LPCTSTR)strPreviewXML, iBookmarkId);

    //m_pHtmlPreview->Navigate2(strPreviewXML, 0, nullptr);
    CString strFileXSLPath = theApp.GetWorkingPath() + strFileXSL;
    if (theApp.MSAToolsInterface().TransformXMLToHTML(strFileXSLPath, strPreviewXML, m_strPreviewHTML))
    {
        strURL = m_strPreviewHTML;
        if(iBookmarkId != -1)
            strURL.Format(_T("%s#week%d"), (LPCTSTR)m_strPreviewHTML, iBookmarkId);

    }
    m_pHtmlPreview->Navigate2(strURL, 0, nullptr);
}

我发现:

  1. 锚仍能正常工作并跳到我想要的地方。
  2. Find 继续正常工作,而之前它会停止运行。