2012-09-17 78 views
0

我有一个Windows本机C++/Win32/MFC对话框应用程序。我正在使用对话框中的IE ActiveX控件来呈现一些HTML内容。正在呈现的HTML包含一个按钮。该按钮具有onClick JavaScript处理程序,如下所示。处理C++代码中的HTML按钮单击事件

<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翻译阶段。

回答

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相关问题的时间没有限制。无论如何,祝你好运!

+0

谢谢!我会试一试。 – Nerdtron

+0

我在当天做了很多关于OLE/COM的阅读,但都试图忘记它:)我现在试图通过最快/最简单的方式来排序一个简单的对象,以获得一个头痛来自Javascript的方法调用... – Nerdtron

+1

同意。查看更新的答案。 –