MSHTML: обратный вызов при вставке изображения

В настоящее время я работаю над внедрением редактора HTML в приложение C ++ WinAPI с использованием компонента MSHTML.

У меня все настроено (активация режима редактирования, изменение шрифта и т. Д.), Но теперь я должен поддерживать вставку изображений. MSHTML уже имеет встроенную поддержку, но, насколько мне известно, этой поддержки недостаточно.

Почему-то мне нужен способ перехвата вставки изображений в HTML-редактор, поскольку мне нужно создать список изображений в пользовательском интерфейсе нашего приложения. Поэтому, когда пользователь использует диалог по умолчанию MSHTML-компонента для вставки изображения или обновления его источника (например, из файла: //xyz.jpg в файл: //abc.jpg), я хочу, чтобы мой код был уведомлен ,

Я уже посмотрел на концепцию «Редактирование дизайнеров», реализацию IHTMLEditHost или интерфейс DWebBrowserEvents2. Но, похоже, ничего не помогает.

Возможно, кто-то может дать мне подсказку?

1

Решение

Хорошо,

похоже, вы не можете явно подписаться на конкретные изменения документа. Что вы можете сделать, так это создать так называемую «Раковину изменения».

Каждый раз, когда вы изменяете документ, вводимый пользователем или программным способом, вы можете получить уведомление о том, что «что-то» изменилось в вашем документе. Это может быть сделано путем реализации IHTMLChangeSink интерфейс и присоединение его к IMarkupContainer2 IHTMLDocument2.

Пример кода (не полный):

class CHTMLChangeSink : public IHTMLChangeSink
{
public:
// Implement IUnknown: QueryInterface, AddRef, Release
// Implement IHTMLChangeSink:
HRESULT STDMETHODCALLTYPE Notify()
{
// Notify() is called everytime the document changes
return S_OK;
}
};

CHTMLChangeSink * pChangeSink = new CHTMLChangeSink();
IHTMLDocument2 * pDoc; // lets suppose we already have it
IMarkupContainer2 * pMarkupContainer = nullptr;
if (pDoc->QueryInterface(IID_IMarkupContainer2, reinterpret_cast<void **>(&pMarkupContainer)) == S_OK) {
DWORD dwCookie = 1;
// registration is done here
pMarkupContainer->RegisterForDirtyRange(pChangeSink, &dwCookie);
}

Помните, что документ должен быть загружен полностью (зарегистрируйтесь для DIID_DWebBrowserEvents2:: DocumentComplete).

С этого момента всякий раз, когда происходит изменение в документе, будет вызываться ваш метод Notify, и вы сможете выполнить дальнейшую обработку, чтобы выяснить, что изменилось (например, обработать список изображений в документе).

Повеселись!

0

Другие решения


По вопросам рекламы [email protected]