IE网页截图是IE编程中的经典问题。 IE9 beta发布之后我收到很多关于这方面的问题。 最近我把IE和Windows中这部分相关的代码重新架构了一下,使它们能够在IE9开启硬件加速的情况下完美兼容原来GDI函数。 趁着记忆还fresh, 写一个总结以供大家参考。
主要有以下3个接口可以实现IE网页截图。
1) HRESULT IHTMLElementRender::DrawToDC(HDC hDC)
MSDN参考: http://msdn.microsoft.com/en-us/library/aa752273(VS.85).aspx
简单代码示例:
- IHTMLDocument3 *pDoc = ...;
- IHTMLElement *pDocElement = NULL;
- pDoc->get_documentElement(&pDocElement );
- IHTMLElementRender *pRender = NULL;
- pDocElement ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);
- pDocElement->DrawToDC(hImageDC);
注意事项: Quirks 模式下,documentElement不存在, 请使用BODY元素。
优点: 可以画某个特定的HTML元素
缺点:
需要判断是不是Quirks模式下,进而决定拿documentElement元素还是BODY元素的的指针;
只能按目前屏幕显示大小截取,不支持缩放;
在有些情况就是当网页由frames 组成或者是个内嵌的doc/pdf文档,该可能会失败;
2) HRESULT IViewObject::Draw( DWORD dwAspect, LONG lindex, void * pvAspect, DVTARGETDEVICE * ptd, HDC hicTargetDev, HDC hdcDraw, const LPRECTL lprcBounds,
const LPRECTL lprcWBounds, BOOL (*) (DWORD) pfnContinue, DWORD dwContinue )
MSDN参考:http://msdn.microsoft.com/en-us/library/ms688655(VS.85).aspx
简单代码示例:
- IHTMLDocument2* pDoc = ...;
- IViewObject* pViewObject = NULL;
- pDoc->QueryInterface(IID_IViewObject, (void**)pViewObject);
- pViewObject->(DVASPECT_CONTENT, 1, NULL, NULL, hScreenDC, hImageDC, rcSource, NULL, NULL, 0);
优点: 可以缩放,IE会根据传入的lprcBounds自行缩放图片。
缺点:
因为要计算缩放,速度会较慢;
截取整个文档的可见区域,没法截取特定的元素
有些第三方的ActiveX没有实现IViewObject接口,导致那些ActiveX没有出现在截图里面。
3) BOOL PrintWindow( hwnd, HDC hdcBlt, nFlags)
MSDN参考:http://msdn.microsoft.com/en-us/library/dd162869(VS.85).aspx
简单代码示例:
- IWebBrowser2* pIWebBrowser2 = ...;
- HWND hTridentWnd= NULL;
- IOleWindow* pOleWin = NULL;
- pIWebBrowser2->QueryInterface(IID_PPV_ARGS(&pOleWin));
- pOleWin->GetWindow(&hTridentWnd);
- ::PrintWindow(hTridentWnd, hImageDC, PW_CLIENTONLY);
优点: 内容完整,就算ActiveX没有实现IViewObject接口,也会被截图。
缺点:
只能按目前屏幕显示大小截取,不支持缩放;
速度不如IHTMLElementRender::DrawToDC
注:以上代码示例都是简化版,实际使用请检查函数返回值以及指针有效性。
总结
综合考虑, PrintWindow 是首选, 简单而且内容完整。 如果你希望得到缩放的结果,那选择IViewObject::Draw。 如果你想要对特定某个元素截图, 那选择IHTMLElementRender::DrawToDC。
更多信息请查看 java进阶网 http://www.javady.com
分享到:
相关推荐
最新ie编程web编程软件实现web通讯
IE编程完全解决实例.rar IE编程完全解决实例.rar IE编程完全解决实例.rar
IE编程实例 删除IE相关历史记录 c++ 原代码
详细说明了WebBrowser的使用和IE编程,作为说明文档比较合适。
IE接口编程文档的汇总,CHM格式 自动模拟点击HTML页面,自动提交表单等
删除IE相关历史记录【\chap4\DelHistory】 将应用程序加入到IE工具栏【\chap4\AddToToolBar】 超级链接的实现【\chap4\HyperLink】 禁止IE的弹出窗口【\chap4\StopPopup】 禁止浏览某些网站【\chap4\StopTravel】 IE...
本WebBrowser编程技术包括Delphi、C#、VC++、VB等编程资料的集合,其中的 实例大多以Delphi为示例讲解,Delphi7 IDE开发环境。 IE_WebBrowser编程技巧 修改WebBrowser的header信息? Delphi查看...
VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动工具栏VB编程源代码 22IE式浮动...
VisualC 实效编程 96 设置IE的标题VisualC 实效编程 96 设置IE的标题VisualC 实效编程 96 设置IE的标题VisualC 实效编程 96 设置IE的标题VisualC 实效编程 96 设置IE的标题VisualC 实效编程 96 设置IE的标题VisualC ...
IE编程实例 简单的浏览器的实现 c++ 原代码
EasyBuilder Pro V6.00.01.210
将应用程序加入到IE工具栏 IE编程实例 原代码 c++
内含泵阀图形、水箱图形、仪器仪表图形、变量登记、报警登记、以太网连接smart PLC通讯设置等等
VC编程实现IE风格的界面VC编程实现IE风格的界面
精彩编程与编程技巧-利用IE控件设计简易浏览器 ...
利用VC实现IE风格的界面,学习一下VC的界面美化技巧
在IE8与IE6的编程方法不一样,在网上找了很长时间,都找不到IE8怎么编程,在IE8中,如果用IE6的方法得到的IHtmlDocument是无效的,不能操作,得使用另一种方法来编程,请看例子吧,例子为本人在工作中总结出来的,像IE8中的...
IE网页源码提取修改 关于本人在组件对象编程的实例完结,EXE功能是删减的! 网页源码提取查看应该满足你!
VisualC 实效编程 97 在IE工具栏中加入快捷图标VisualC 实效编程 97 在IE工具栏中加入快捷图标VisualC 实效编程 97 在IE工具栏中加入快捷图标VisualC 实效编程 97 在IE工具栏中加入快捷图标VisualC 实效编程 97 在IE...