我们有一个旧版 C++ (MFC) 应用程序。它的一部分承载了一个 CWebBrowser2 对象,我们在其中导航到一个 url,这是我们正在开发以添加到我们的应用程序中的一个新模块。该模块是一个 HTML5 应用程序。由于 CWebBrowser2 使用 IE(当前为 IE8),我们传递给它的 URL 会加载 Chrome Frame 并传递给另一个 URL,即我们的模块。
所以,url 是这样的(注意:用户不能输入这个,它是由我们每个站点配置的):
http://server/ChromeFrameWrapper.htm?http://server/Module.htm?Param1=something&Param2=somethingElse
在 ChromeFrameWrapper.htm 中,我们有可以获取 url 的代码,取第一个 ? 并将 chromeFrame.src 设置为此,因此我们的模块很好地显示在我们的 C++ 应用程序中。
现在的问题。在这个 HTML5 模块中,我们有一些导航按钮(注意:如果需要,它可以是一个锚点)。我们想要发生的是当用户单击这些按钮之一时,主应用程序(C++ MFC 应用程序)会收到单击通知。由于有几个按钮,我们需要知道它是哪个按钮,因为我们将根据点击的内容导航到 C++ 应用程序中的不同位置(我们确实有这样做的原因,这只是我们完全替换 C++ 应用程序的第一步)。
在 C++ 应用程序中,我能够获取 IHTMLDocument2 对象和标签集合,但这是针对 ChromeFrameWrapper HTML 的。到目前为止,我已经能够做到这一点。
- 是否有可能连接一些东西,以便我们的 C++ 应用程序能够接收来自 HTML5 模块的点击事件?
- 如果是这样,怎么做?我被困住了,找不到任何涉及 Chrome Frame 托管 HTML 和事件的示例。使用 MSHTML 是正确的方式,还是有别的方法?
这是 ChromeFrameWrapper.htm 的 SCRIPT 和主要 HTML。请注意,我们正在尝试证明它有效,因此除非它解决了我的问题,否则没有代码批评。
感谢您的帮助和洞察力。
<SCRIPT type="text/javascript">
function GetChromeFrame() {
var chromeFrame = window.document.ChromeFrame
return chromeFrame;
}
function onLoad() {
var theUrl = window.location.href;
// just grab the arguments and pass them as is
var chromeFrameSource = GetArgumentsFromUrl(theUrl);
var chromeFrame = GetChromeFrame();
chromeFrame.src = chromeFrameSource;
}
function GetArgumentsFromUrl(theUrl)
{
if(theUrl.indexOf("?") != -1)
{
return theUrl.substring(theUrl.indexOf("?") + 1);
}
return "";
}
</SCRIPT>
<BODY onload="onLoad();">
<center>
<OBJECT ID="ChromeFrame" WIDTH=1060 HEIGHT=800 CODEBASE="http://www.google.com" CLASSID="CLSID:E0A900DF-9611-4446-86BD-4B1D47E7DB2A">
<PARAM NAME="src" VALUE="http://www.google.com" />
<embed ID="ChromeFramePlugin" NAME="ChromeFrame" SRC="http://www.google.com" TYPE="application/chromeframe"/>
</OBJECT>
</center>
</BODY>