使用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;
}

DHTML Process Using MSHTML相关推荐

  1. html特殊字符p如何屏蔽 asp,利用asp去除html标记的四种方法

    利用asp去除html标记的四种方法 发布日期:2015-10-8 16:10:45 利用asp去除html标记的四种方法 方法一 : 使用"" 如果您想要知道如何从文本中删除ht ...

  2. System.Diagnostics.Process 执行.EXE

    分类:  C#+WINFORM 2009-04-05 21:09 459人阅读 评论(0)  收藏  举报   我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要 ...

  3. 关于.Net中Process和ProcessStartInfor的使用

    System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如&qu ...

  4. System.Diagnostics.Process.Star的用法

    System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如&qu ...

  5. 如何用mshtml获得Javascript中function的返回值[mshtml]

    marginwidth="0" marginheight="0" src="http://218.16.120.35:65001/PC/Global/ ...

  6. 【转载】关于MSHTML

    来源:http://blog.csdn.net/jiangsheng/archive/2003/08/15/3793.aspx 本文翻译自 http://msdn.microsoft.com/work ...

  7. DHTML乌托邦:使用JavaScript和DOM的现代Web设计

    动态HTML(简称DHTML)是一组Web开发技术的名称,这些技术主要用于具有非平凡用户输入功能的Web页面. DHTML意味着处理HTML文档的文档对象模型,在样式信息中摆弄CSS指令,并使用客户端 ...

  8. C# 之 System.Diagnostics.Process.Start 的妙用

    ▪ 前言 我们经常会遇到在 Winform 或是 WPF 中点击链接或按钮打开某个指定的网址. 或者是需要打开电脑中某个指定的硬盘分区及文件夹.甚至是 "控制面板" 等相关的东西, ...

  9. System.Diagnostics.Process.Start 用法

    Process.Start()方法详解_System.Diagnostics.Process.Start()的用法 ,转 System.Diagnostics.Process.Start(); 能做什 ...

最新文章

  1. C#中的空值的判断(转)
  2. 校园计算机故障解决方论文法,计算机故障与处理-计算机专业毕业论文.pdf
  3. 新兴短距离无线通信技术ZigBee入门到进阶
  4. [笔记][原创]Verilog HDL语法分析笔记
  5. 入门实践,Python数据分析
  6. java信号灯_java 信号灯 Semaphore
  7. 动态图相册 android,‎动态图相册 in de App Store
  8. python 类变量和实例变量
  9. POJ-2488 A Knights Journey-深度优先搜索DFS
  10. CamOdoCal_2013-IROS_多个普通相机和里程计的内参和外参自动标定
  11. 内存管理 kmalloc
  12. 线性规划问题求解(Excel、python和手工求解)
  13. PE使用万能驱动7解决USB3、NVME驱动问题及台式机、笔记本电脑使用PE因驱动问题不能加载硬盘问题(YOGA 14C 因PE加载不了硬盘亲测可用)
  14. AVPlayer设置从哪儿开始播放
  15. 基于等离激元的空间微分
  16. 【Unity3D】使用Unity做一个简单的游戏,roll_a_ball,第一步创建游戏。
  17. 梁念坚漫步“云+端”
  18. 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环10 次(线程面试:windows下实现)
  19. algodoo是什么意思_洋是什么意思 带洋字的男孩名字 用洋字起名的寓意
  20. Halcon卡尺测量

热门文章

  1. 探索推荐引擎内部的秘密 - 推荐引擎初探
  2. 渣土车识别检测系统-yolov5
  3. Android Studio Button 美化
  4. 《奇葩说》撞题郭敬明,面对“死亡”,AI竟然赚足眼泪和流量?
  5. Tomcat4.1、5.5、6.0的连接池配置及测试程序
  6. 华南师范大学计算机学院保研,广东高校保研率|进了广东这些大学,离保研也近了一步...
  7. 混沌工程之ChaosBlade(一):建立混沌工程思想
  8. Python - 定时自动获取 Bing 首页壁纸
  9. 孙子定理(中国剩余定理)
  10. BUGKU--web详解