【问题标题】:Handling an HTML button click event in C++ code在 C++ 代码中处理 HTML 按钮单击事件
【发布时间】:2012-09-18 05:34:21
【问题描述】:

我有一个 Windows 原生 C++/Win32/MFC 对话框应用程序。我在对话框中使用 IE ActiveX 控件来呈现一些 HTML 内容。正在呈现的 HTML 包含一个按钮。该按钮有一个 onClick javascript 处理程序,如下所示。

<input type="button" id="uniqueButtonID" name="uniqueButtonName" value="blue" onClick="OnButtonClick('blue');">

目前,页面中的按钮点击由显示的 javascript 处理程序处理。这一切都有效。

相反,我想处理对话框 C++ 代码中的按钮单击。

我有一些处理对话框中其他事件的经验。例如,以下工作并允许处理文档完成事件和导航。

BEGIN_EVENTSINK_MAP(DMyDlg, CDialog)
ON_EVENT(DMyDlg, IDC_EXPLORER2, 259, DMyDlg::DocumentCompleteExplorer2, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(DMyDlg, IDC_EXPLORER2, 250, DMyDlg::BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
END_EVENTSINK_MAP()

这些都是预定义的众所周知的事件。不知道如何将其转化为处理我在 onClick="" 部分的按钮中定义的内容。

有人知道怎么做吗?这里的动机是我在另一个 C++ 应用程序中使用了一些代码,它定义了一些业务逻辑。我想要这里使用相同的业务逻辑。目前,我每次都必须将其翻译成 Javascript。如果我可以在 C++ 代码中处理事件,我可以复制/粘贴(或通过 DLL 重新使用)并避免 Javascript 翻译阶段。

【问题讨论】:

    标签: javascript c++ html windows mfc


    【解决方案1】:

    您需要创建一个 COM 对象作为 JavaScript 和 C++ 之间的桥梁。 JavaScript 初始化代码如下所示:

    var myhelper = new ActiveXObject("MyCompany.MyHelper");
    

    请注意,尽管名称为“ActiveXObject”,但该对象不必是完整的 ActiveX 控件,只要是 COM 对象即可。然后在您的 onClick 处理程序中,您可以这样做:

    myhelper.DoThis();
    myhelper.DoThat();
    

    “有趣”的部分是在 C++ 中创建 COM 对象 - IDL 文件、ATL 类、IDispatch、IUnknown 以及所有我想忘记的东西。

    但有一件事 - 如果 C++ 代码存在于您的应用程序 exe 中(而不是在单独的 COM DLL 中),请不要忘记当您的程序启动时,您必须为“MyCompany.MyHelper”创建一个类工厂实例,并且向 COM 注册它,以便 JavaScript 中的“新 ActiveXObject”成功。

    [更新 1]

    我应该在最初的回复中添加 - 如果可以避免的话,我实际上不建议这样做。早在 C# 和 .NET 出现之前,我们公司实际上虽然 COM 是个好东西,而且值得花时间和精力去学习它。今天……没那么多。

    在您的情况下,在 C++ 和 JavaScript 中编写业务逻辑似乎需要做很多额外的工作 - 但至少这是您可以计划、分配资源并希望能够完成的额外工作.一旦你走上了 C++/COM/ActiveScripting 的道路,当事情停止工作时——你可能会花费无限的时间来尝试解决与 COM 相关的晦涩问题。总之祝你好运!

    【讨论】:

    • 谢谢!我会试试看。
    • 我以前确实在 OLE/COM 上做了很多阅读,但我试图忘记它 :) 我现在很头疼,试图找出最快/最简单的方式来站起来一个简单的对象,只是为了从 Javascript 中获取方法调用...
    • 我听到了;这就是它目前和正在工作的方式。 C++ 业务逻辑只是翻译成 Javascript。作为旁注,我确实想到了一种非常hacky的方法来做到这一点 - 几乎羞于说它,但是......我能够很容易地从C ++获取/设置HTML中复选框的值(只需访问文档对象等)。所以也许一种可能性是有一个隐藏的复选框。当您单击按钮时,onClick 只会设置复选框。 C++ 代码轮询,如果设置了复选框,则清除它,然后执行它的操作。是的,我知道,可怕的 hacky :)
    • 我发布了一个后续问题here,看看是否有人有一些关于轻松建立 COM 对象的技巧。即使在这个特定的应用程序(可能的解决方案是将逻辑留在 Javascript 中)之外,能够在 C++ 和 HTML/javascript 之间进行更好的集成对于其他项目来说也是很好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2013-05-24
    相关资源
    最近更新 更多