如何在c++中为嵌入式web控件提供图像数据
How to provide image data for embedded web control in C++
在我的c++应用中,我嵌入(通过COM)一个web浏览器(Internet Explorer)控件(CLSID_WebBrowser)。
我可以通过使用IHTMLDocument2::write()方法在该控件中显示我自己的html,但如果html有<img src="foo.png">
元素,则不显示。
我假设有一种方法让我以某种方式为web控件提供foo.png的数据,但我找不到合适的地方来挂钩这个功能?
我需要完全控制提供foo.png的内容,所以像使用res://协议或保存到磁盘和使用file://协议这样的解决方案还不够好。我只是想以某种方式插入我的代码,以便当嵌入CLSID_WebBrowser控件在IHTMLDocument2::write()给出的html数据中看到<img src="foo.png">
时,它会要求我提供此数据。
回答我自己的问题,最终对我有效的解决方案是:
-
register custom IInternetProtocol/IInternetProtocolInfo/via custom IClassFactory给IInternetSession::RegisterNameSpace()。由于对我来说似乎是一个bug的原因,它必须是IE已经知道的协议(我选择了"its"),即使它是我自己的,唯一的命名空间会更好。
-
通过IPersistentMoniker::Load()通过自定义IMoniker提供html数据,并确保IMoniker::GetDisplayName()(这是一个基础url,根据提供的html中的相对链接将被解析)以该协议方案开始(在我的情况下"its://")。这样,html数据中的相对链接"foo.png"将是它的://foo.png到IE,这将使urlmon调用IInternetProtocol::Start()和IInternetProtocol::Read()来请求该url的数据。
这是相当复杂的,你可以看看实际的(bsd许可的)代码在这里:http://code.google.com/p/sumatrapdf/source/browse/trunk/src/utils/HtmlWindow.cpp
你可以嵌入一个小的web服务器,如mongoose,并从那里引用这些图片。
在mongoose中,您可以将回调附加到特定路径,从而从c++代码返回图像。
我们将其用于调试工具,其中每个图像都可以从web界面
最简单的解决方案是Data URI。您可以直接使用IHTMLDocument2::write()
将图像内联。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 如何在VC++中将图像放置在图片控件的特定位置
- 使用OpenCV 2.4在MFC SDI视图或控件中加载图像
- MFC在运行时在图片控件中显示图像
- 如何在c++中为嵌入式web控件提供图像数据
- 在图片控件中绘制图像
- 在富编辑控件中插入位图图像