CHtmlView: как получить данные по клику? - PullRequest
0 голосов
/ 02 июня 2011

У меня есть приложение MFC, которое использует CHtmlView.Он отображает некоторый текст в формате HTML из некоторого временного файла HTML.Можно ли обработать щелчок мышью на абзаце, чтобы отправить некоторые данные в программу?Я понимаю, что javascript можно использовать для обработки кликов, но как передать данные из функции javascript в приложение?Спасибо.

1 Ответ

1 голос
/ 03 июня 2011

Можно аккуратно вызвать содержащее приложение из Javascript HTML-страницы. На уровне Javascript интерфейс MSHTML, который выполняет фактическую работу CHtmlView, предоставляет «внешний» объект, который действует как обратный путь к вызывающему приложению.

Предположим, мы хотим добавить метод "someCall ()", который можно вызывать из Javascript, и что метод принимает строку в качестве аргумента. В 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()

Чтобы связать эту реализацию "external" с представлением HTML, в классе, производном от CHtmlView, вам нужно перегрузить OnGetExternal () и указать на экземпляр TestExternal, который живет по крайней мере столько же, сколько CHtmlView

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;
};

Обратите внимание, что я на самом деле не проверял это, но, похоже, прямо по памяти ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...