目前我正在使用MSHTML组件将HTML编辑器嵌入到C ++ WinAPI应用程序中。
我设置了一切(激活编辑模式,更改字体等),但现在我必须支持插入图像。 MSHTML已经内置了对它的支持,但据我所知,这种支持还不够。
不知何故,我需要一种方法来拦截将图像插入到HTML编辑器中,因为我必须在应用程序的UI中创建一个图像列表。因此,每当用户使用MSHTML组件的默认对话框插入图像或更新其源(例如从文件://xyz.jpg到file://abc.jpg)时,我希望我的代码得到通知
我已经查看了“编辑设计器”的概念,IHTMLEditHost的实现或DWebBrowserEvents2接口。但似乎没有什么可以做到的。
也许有人可以给我一个提示?
答案 0 :(得分:0)
好,
看起来您无法明确订阅文档的特定更改。你可以做的是创建一个所谓的" Change Sink"。
每当您通过用户输入或以编程方式更改文档时,您都可以收到通知"某些内容"在您的文档中已更改。这可以通过实现IHTMLChangeSink接口并将其附加到IHTMLDocument2的IMarkupContainer2来完成。
示例代码(未完成):
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方法,您可以进行进一步处理以找出更改的内容(例如,处理文档中的图像列表)。
玩得开心!