CHtmlView:如何获取点击数据?

时间:2011-06-02 13:16:27

标签: javascript html mfc

我有一个使用CHtmlView的MFC应用程序。它从一些临时html文件中以html格式显示一些文本。是否可以处理段落上的鼠标点击以向程序发送一些数据?我明白javascript可以用来处理点击,但是如何将数据从javascript函数传递给应用程序? 感谢。

1 个答案:

答案 0 :(得分:1)

可以从HTML页面的Javascript中干净地调用包含的应用程序。在Javascript级别,正在执行CHtmlView实际工作的MSHTML接口提供了一个“外部”对象,作为返回调用应用程序的一种方式。

假设我们要添加一个可以从Javascript调用的方法“someCall()”,并且该方法将字符串作为参数。在JavaScript中,我们将其称为

external.someCall("An example string");

在MFC应用程序中,我们需要编写一个CCmdTarget派生对象来充当“外部”对象的实现,作为基于调度的COM对象,如:

class TestExternal : public CCmdTarget
{
public:
  TestExternal()
  {
    EnableAutomation();
  }

  void SomeCall(LPCWSTR str)
  {
    // This is where we get called when the Javascript runs...
  }

private:
  DECLARE_DISPATCH_MAP()
};

BEGIN_DISPATCH_MAP(TestExternal,CCmdTarget)
  DISP_FUNCTION(TestExternal,"someCall",SomeCall,VT_EMPTY,VTS_WBSTR)
END_DISPATCH_MAP()

要将“外部”的这种实现与HTML视图联系起来,在从CHtmlView派生的类中,您需要覆盖OnGetExternal()并将其指向一个至少与CHtmlView一样长的TestExternal实例:

class TestHtmlView : public CHtmlView
{
  // Usual implementation stuff goes here...

public:
  HRESULT OnGetExternal(LPDISPATCH *lppDispatch)
  {
    *lppDispatch = m_external.GetIDispatch(TRUE);
    return S_OK;
  }

private:
  TestExternal m_external;
};

请注意,我实际上并没有对此进行过测试,但它似乎与内存有关...