使用MSHTML 对 Html 进行DOM 操作(放缩,颜色...),HTML抓图(放缩,滚动,拼接)

以前的代码,使用ATL会更整洁

//  放缩抓图

void CPageCaptureView::GetZoomPageDC()
{
    LONG lWidth = WINDOW_WIDTH;
    LONG lHeight = WINDOW_HEIGHT;
    BOOL bMargin = TRUE;
    IOleWindow *InterfacePtr = NULL;
    IHTMLDocument2* pDoc = NULL;
    IHTMLElement* pBodyElem = NULL;
    IHTMLBodyElement* pBody = NULL;
    IHTMLElement2* pBodyElement2=NULL;
    IHTMLStyle* pStyle = NULL;
    IHTMLStyle3 *pStyle3=NULL;
    LPDISPATCH pDisp = NULL;
    IOleObject * pObj = NULL;
    HRESULT hr = S_OK;

pDisp = GetHtmlDocument();
    ASSERT(pDisp);
    if (pDisp)
    {
        hr = pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
        if (SUCCEEDED(hr)&&pDoc)
        {
            hr = pDoc->get_body(&pBodyElem);
            if (SUCCEEDED(hr)&&pBodyElem)
            {
                // hide 3D border
                hr =pBodyElem->get_style(&pStyle);
                if (SUCCEEDED(hr)&&pStyle)
                {
                    pStyle->put_borderStyle(CComBSTR("none"));
                    hr = pStyle->QueryInterface(IID_IHTMLStyle3,(void**)&pStyle3);
                    if (SUCCEEDED(hr&&pStyle3))
                    {
                        CString str(ZOOM);
                        BSTR bStr = str.AllocSysString();
                        VARIANT var;
                        var.vt = VT_BSTR;
                        var.bstrVal= bStr;
                        pStyle3->put_zoom(var);   
                        if (bStr)
                        {
                            SysFreeString(bStr);
                        }
                        pStyle3->Release();
                    }
                    pStyle->Release();
                }   
                // hide scroll bars
                hr = pBodyElem->QueryInterface(IID_IHTMLBodyElement, (void**)&pBody);
                if (SUCCEEDED(hr)&&pBody)
                {
                    pBody->put_scroll(CComBSTR("no"));
                    pBody->Release();
                }
                // get dimension and resize
                hr = pBodyElem->QueryInterface(IID_IHTMLElement2, (void**)&pBodyElement2);
                if (SUCCEEDED(hr)&&pBodyElement2)
                {
                    long iScrollWidth = 0,iScrollHeight = 0,
                        iClientWidth = 0,iClientHeight = 0;
                    pBodyElement2->get_scrollWidth(&iScrollWidth);
                    pBodyElement2->get_scrollHeight(&iScrollHeight);
                    pBodyElement2->get_clientWidth(&iClientWidth);
                    pBodyElement2->get_clientHeight(&iClientHeight);
                    CString strZoom(ZOOM);
                    strZoom.Replace("%","");
                    float fZoom = atof(strZoom)/100.0;
                    if (iScrollWidth>iClientWidth)
                    {
                        lWidth =  fZoom * iScrollWidth;       
                        bMargin = FALSE;
                    }
                    if (iScrollHeight>iClientHeight)
                    {
                        lHeight = fZoom * iScrollHeight;
                    }
                    SetWindowPos(NULL,0,0,lWidth,lHeight,SWP_HIDEWINDOW); 
                    pBodyElement2->Release();
                }

LONG lBmpWidth = lWidth;
                LONG lBmpHeight = lHeight;
                LONG lMarginLeft = 50, lMarginRight = 50, lMarginTop  = 35, lMarginBottom  = 35;

if (lBmpWidth > lBmpHeight*ASPECT_RADIO)
                {
                    lBmpHeight = lBmpWidth/ASPECT_RADIO;
                }
                else
                {
                    lBmpWidth = lBmpHeight*ASPECT_RADIO;
                }
                if (!bMargin)
                {
                    lMarginLeft = lMarginRight = lMarginTop = lMarginBottom = 0;
                    lBmpWidth = lWidth;
                    lBmpHeight = lHeight;
                }
                LONG lPageWidth = lBmpWidth + lMarginLeft + lMarginRight;
                LONG lPageHeight = lBmpHeight + lMarginTop + lMarginBottom;

// resize ole
                hr = m_pBrowserApp->QueryInterface(IID_IOleObject,(void**)&pObj);
                if (SUCCEEDED(hr)&&pObj)
                {
                    SIZEL size ={lWidth,lHeight};
                    pObj->SetExtent(DVASPECT_CONTENT,&size);
                    pObj->Release();
                }

//Draw
                HDC hScreenDC = ::GetDC(NULL);
                HDC hDrawDC = CreateCompatibleDC(NULL);
//                 SIZE PrevExt1, PrevExt2;
//                 SetMapMode(hImageDC, MM_HIENGLISH);
//                 GetWindowExtEx(hImageDC, &PrevExt1);
//                 GetViewportExtEx(hImageDC, &PrevExt2);
//                
//                 PrevExt1.cx *= 0.6;
//                 PrevExt1.cy *= 0.6;
//                 SetMapMode(hImageDC, MM_ISOTROPIC);
//                 SetWindowExtEx(hImageDC, PrevExt1.cx, PrevExt1.cy, NULL);    //600DPI
//                 SetViewportOrgEx(hImageDC, 0, 0, NULL);
//                 SetViewportExtEx(hImageDC, PrevExt2.cx, -PrevExt2.cy, NULL);

HBITMAP hDrawBmp = NULL;
                hDrawBmp = CreateCompatibleBitmap(hScreenDC, lWidth,
                    lHeight);
                if(!hDrawBmp)
                     return;
                HGDIOBJ hOld = SelectObject(hDrawDC, hDrawBmp);
                RECT rt = {0,0,lWidth,lHeight};
                HBRUSH hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
                FillRect(hDrawDC,&rt,hBrush);
                RECT rcSource={0,0,lWidth,lHeight};           
                OleDraw(m_pBrowserApp,DVASPECT_CONTENT,hDrawDC,&rcSource);

HANDLE hDibNew = pDib->CreateDib(lPageWidth,lPageHeight,NULL, 24);
                if (pDib->hdib)
                {
                    GlobalFree(pDib->hdib);
                    pDib->hdib = NULL;
                }
                if (hDibNew)
                {
                    pDib->CreateDibFromHandle(hDibNew);
                }
                CDrawDib dib;
                HANDLE handle = NULL;
                handle = dib.DibFromBitmap(hDrawBmp,BI_RGB,24,NULL);

if (handle&&pDib)
                {
                    pDib->BitBlts(lMarginLeft+(lBmpWidth-lWidth)/2.0,lMarginTop+(lBmpHeight-lHeight)/2.0,
                        handle);
                    GlobalFree(handle);
                }         
                ::DeleteObject(hBrush);
                ::DeleteObject(hDrawBmp);
                ::ReleaseDC(0, hScreenDC);
                ::DeleteDC(hDrawDC);
                pBodyElem->Release();
            }
            pDoc->Release();
        }
        pDisp->Release();
    }
    g_eventComplete->SetEvent();
}

// 改变Font

HRESULT CPageCaptureView::ChangeFontSize(float nZoom)
{
    CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
    CComQIPtr<IHTMLElementCollection,&IID_IHTMLElementCollection>  pCollection;
    //CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument2> pDoc3;
    CComQIPtr<IHTMLElement,&IID_IHTMLElement> pBody;
    CComQIPtr<IHTMLElement2,&IID_IHTMLElement2> pBody2;
    LPDISPATCH pDisp = NULL;
    HRESULT  hr = S_OK;
    pDisp = GetHtmlDocument();
    if(!pDisp)
    {
        return E_FAIL;
    }
   
    //    hr = pDoc->QueryInterface(IID_IHTMLDocument3,(void**)&pDoc3);
    hr = pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc2);
   
    if (hr || (!pDoc2))
    {
        return E_FAIL;
    }
    hr = pDoc2->get_body(&pBody);//getElementsByTagName(L"SPAN",&pCollection);
    if (hr || (!pBody))
    {
        return E_FAIL;
    }
    pBody->QueryInterface(IID_IHTMLElement2,(void**)&pBody2);
    if (hr || (!pBody2))
    {
        return E_FAIL;
    }
    pBody2->getElementsByTagName(L"SPAN",&pCollection);;
    if (hr || (!pCollection))
    {
        return E_FAIL;
    }
   
    long len;
    VARIANT varIndex;
    VARIANT var2;
    varIndex.vt=VT_I4;
    VariantInit( &var2 );
    pCollection->get_length(&len);
    CComVariant var;
    for(long i=0; i<len; i++)
    {
        CComQIPtr<IHTMLStyle,&IID_IHTMLStyle> pStyle;
        varIndex.lVal=i;
        CComPtr<IDispatch> pDisp;
        pCollection->item(varIndex,var2, &pDisp);
        if (hr || (!pDisp))
        {
            return E_FAIL;
        }
        CComQIPtr<IHTMLElement,&IID_IHTMLElement>  pElement(pDisp);
       
        if ((!pElement))
        {
            return E_FAIL;
        }
        hr = pElement->get_style(&pStyle);
        if (hr || (!pStyle))
        {
            continue;
        }
        hr = pStyle->get_fontSize(&var);
        if(var.bstrVal != NULL && var.vt == VT_BSTR)
        {
            CString strSize(var.bstrVal);
            strSize.TrimLeft();
            strSize.TrimRight();
            if (strSize.Find("pt")!=-1)
            {
                CString str =strSize.Left(strSize.GetLength()-2);
                int n = atoi(str);
                str.Format("%dpt",(int)(n*nZoom));
                var.bstrVal = str.AllocSysString();
                pStyle->put_fontSize(var);
            }
           
        }
    }
    return hr;
}

Html 进行DOM 操作(放缩,颜色...),HTML抓图(放缩,滚动,拼接)相关推荐

  1. 为什么DOM操作很慢

    转自:http://kb.cnblogs.com/page/534571/ 一直都听说DOM很慢,要尽量少的去操作DOM,于是就想进一步去探究下为什么大家都会这样说,在网上学习了一些资料,这边整理出来 ...

  2. jQuery 学习笔记一(认识jQuery jQuery选择器 jQuery中的DOM操作)

    第一章 认识jQuery jQuery代码风格 $(document).ready(function(){ //... }); 简化 $(function(){ //... }); jQuery对象转 ...

  3. Jquery基础之DOM操作

    Jquery基础之DOM操作 Dom是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件.DO ...

  4. 关于 DOM 操作的几个类型

    DOM是Document Object Model的缩写,意思是文档对象模型,是由W3C制定的一套访问和操作XML(eXtensible Markup Language)文档的标准,即API.比如DO ...

  5. JQuery-学习笔记03【基础——DOM操作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JQuery-学习笔记01[基础--JQuery基础]--[day01] JQuery-学习笔记02[基础--JQuery选择器] JQuery-学习 ...

  6. js hover 触发事件_为什么说JS的DOM操作很耗性能

    想问这样的问题,其实是自己心中没有个谱,一直用 js 计算性能来衡量 浏览器dom 操作性能.js性能和浏览器性能其实是两码事. 这个问题很抽象,它里面涉及挺多个小的知识点. 重申一点,js 操作 D ...

  7. html中dom多会有影响吗,DOM操作造成的页面卡顿问题及解决

    相关目录 以下为我总结的其他性能优化点,欢迎参考,指点及吐槽 前言 界面上UI的更改都是通过DOM操作实现的,并不是通过传统的刷新页面实现 的.尽管DOM提供了丰富接口供外部调用,但DOM操作的代价很 ...

  8. JavaScript(五)—— Web APIs 简介/JavaScript 必须掌握的 DOM 操作 (丰富案例 + 思维导图)

    本篇为 JavaScript 系列笔记第五篇,将陆续更新后续内容.参考:黑马程序员JavaScript核心教程,前端基础教程 系列笔记: JavaScript(一)-- 初识JavaScript / ...

  9. 超详细的jQuery的 DOM操作,一篇就足够!

    摘要:今天来和大家分享有关jQuery框架中DOM操作的相关技术,又是一个堪称DOM"全家桶"系列的讲解,建议收藏关注认真学习! 本文分享自华为云社区<[JQuery框架]超 ...

最新文章

  1. Python常用函数与技巧总结(一)
  2. 人工智能:从经典计算机到量子计算机,弱AI进阶到强AI时代?
  3. 「luogu3704」[SDOI2017]数字表格
  4. ueditor图片上传,网络连接错误的解决方案
  5. flash与php交互,flash与PHP的交互技巧
  6. 2018先知白帽大会 | 议题解读
  7. qgis 图片_QGIS入门教程公告!!!
  8. python代码太长_Python 太糟糕了?开发者总结了 8 大原因
  9. Groovy新手教程
  10. 如果“定位BUG”有等级的话,你是什么段位?
  11. ecshop删除购物流程中的配送方式和支付方式
  12. 重装系统数据恢复工具
  13. Android总数的百分比,Android 计算目前使用内存百分比的方法
  14. 计算机太极之光,且看今朝,刚柔并济,叱咤风云
  15. radix-tree算法浅析--从不懂到装懂
  16. 百度坐标批量转换成WGS84坐标
  17. 我是个女生,只有这样我才能找到工作
  18. html5 移动页面,html5入门到精通,移动设备的html5页面布局
  19. MyBatis中的Mapper.xml文件解析
  20. 近端策略优化算法(PPO)

热门文章

  1. zabbix agent 类型所有key
  2. 支付系统设计:支付系统的账户模型(一)
  3. 四大步骤做好需求调研
  4. 不知道自己是否适合做产品经理
  5. python开发小型数据库_python web开发之数据库ORM的 peewee库 动手学习实践笔记
  6. 如何绘制逻辑图 — 2.要素的属性
  7. 【2016年第5期】基于征信大数据分析的中国劳动力人口迁徙研究
  8. 作者:李翠平, 女, 中国人民大学信息学院教授、 博士生导师。
  9. 【Java】辨析jvm.dll、java.exe、javaw.exe、javaws.exe
  10. 【数据结构与算法】二维Kd树的Java实现