c++ - MSHTML:图像插入回调

标签 c++ winapi com mshtml ie-automation

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

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

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

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

也许有人可以给我提示?

最佳答案

好的,

看起来您无法明确订阅文档的特定更改。您可以做的是创建一个所谓的“Change Sink”。

每次您更改文档时,无论是通过用户输入还是以编程方式,您都会收到通知,告知您文档中的“某些内容”发生了更改。这可以通过实现 IHTMLChangeSink 来完成接口(interface)并将其附加到 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 方法就会被调用,您可以做进一步的处理以找出发生了什么变化(例如处理文档中的图像列表)。

玩得开心!

关于c++ - MSHTML:图像插入回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310836/

相关文章:

c++ - 从 C++ 中的 wxTextCtrl 获取条目文本

c++ - 使用 C++ 将 STDIN 数据读入控制台应用程序的最快方法是什么

dll - 我如何知道 dllmain 何时完成?

.net - 在 Delphi 应用程序中从 COM 调用 WPF Windows

c# - 我是否需要释放用作函数参数的托管 BSTR

c++ - 与 glfw3 链接时出错

c++ - 子图的图特征

java - JNI GetDirectBufferAddress 与 ByteBuffer.array()

c 多线程冲突

.net - 为什么 E_OUTOFMEMORY 后面跟着 "no more threads can be created"?