无法将 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);
}
我发现:
- 锚仍能正常工作并跳到我想要的地方。
- Find 继续正常工作,而之前它会停止运行。
我被这个难住了!
我有自己的 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);
}
我发现:
- 锚仍能正常工作并跳到我想要的地方。
- Find 继续正常工作,而之前它会停止运行。