1

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

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

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

我已经看过“编辑设计器”的 conecpt、IHTMLEditHost 的实现或 DWebBrowserEvents2 接口。但似乎没有什么能解决问题。

也许有人可以给我一个提示?

4

1 回答 1

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)。

从现在开始,每当文档发生更改时,您的通知方法将被调用,您可以进行进一步处理以找出更改的内容(例如处理文档中的图像列表)。

玩得开心!

于 2014-08-19T09:08:54.270 回答