我有一个使用CHtmlView的MFC应用程序。它从一些临时html文件中以html格式显示一些文本。是否可以处理段落上的鼠标点击以向程序发送一些数据?我明白javascript可以用来处理点击,但是如何将数据从javascript函数传递给应用程序? 感谢。
答案 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;
};
请注意,我实际上并没有对此进行过测试,但它似乎与内存有关...