关于图像插入的回调

MSHTML: Callback on image insertion

本文关键字:插入 回调 图像 于图像      更新时间:2023-10-16

目前,我正在使用MSHTML组件将HTML编辑器嵌入到c++ WinAPI应用程序中。

我把一切都设置好了(激活编辑模式,改变字体等),但现在我必须支持插入图像。MSHTML已经内置了对它的支持,但据我所知,这种支持还不够。

不知何故,我需要一种方法来拦截图像插入到html编辑器中,因为我必须在应用程序的UI中创建一个图像列表。因此,每当用户使用mshtml组件的默认对话框插入图像或更新其源(例如,从file://xyz.jpg到file://abc.jpg)时,我希望我的代码得到通知。

我已经看到了"编辑设计器"的概念,IHTMLEditHost的实现,或DWebBrowserEvents2接口。但似乎没有什么能奏效。

也许有人能给我一个提示?

好的,

似乎不能显式订阅文档的特定更改。你能做的就是创建一个所谓的"变化池"。

每当您更改文档时,无论是通过用户输入还是通过编程方式,您都可以获得文档中"某些内容"更改的通知。这可以通过实现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方法将被调用,你可以做进一步的处理来找出发生了什么变化(例如处理文档中的图像列表)。

玩得开心!