关于图像插入的回调
MSHTML: Callback on image insertion
目前,我正在使用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方法将被调用,你可以做进一步的处理来找出发生了什么变化(例如处理文档中的图像列表)。
玩得开心!
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- 关于图像插入的回调