分享

PrintWindow函数、CxImage、GSOAP实现隐藏窗口抓图到JPEG并通过webservice传至服务器

 quasiceo 2015-08-06

PrintWindow函数、CxImage、GSOAP实现隐藏窗口抓图到JPEG并通过webservice传至服务器

分类: CxImage 1389人阅读 评论(0) 收藏 举报

类似于快照功能,前提是将需要抓图的窗口移到视区之外实现隐藏,并不是将窗口属性设为不可见,我的模块是在对话框子窗体中打开ie控件,浏览到指定网站并截图。

因此主窗体生成非模态对话框,该子对话框内嵌ie控件,并将该子对话框移到可视区域之外,环境依然是VC6.0。

创建子对话框的代码:

  1.  pShowBrowser=new CShowBrowser();  
  2.  pShowBrowser->Create(IDD_SHOWBROWSER,this);  
  3.  pShowBrowser->MoveWindow(2000,1500,1024,768);//移到视区之外  
  4.  pShowBrowser->ShowWindow(SW_SHOW);  
  5.  pShowBrowser->Navigate(www.baidu.com);//导航到指定网站  
  6.   
  7. //抓图并保存到内存,以被GSOAP发送到webservice服务端  
  8.   
  9. // pBinary: webservice二进制参数指针  
  10.   
  11. void CNetTestVDlg::SaveImagetoBinary(xsd__base64Binary* pBinary)  
  12. {  
  13.   
  14. //对VC6.0来说PrintWindow,是隐藏函数,通过地址使用  
  15.  typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);     
  16.  HMODULE h;    
  17.  h = LoadLibrary( _T("user32.dll") );    
  18.  pPrintWindow p;    
  19.  if( h )    
  20.  {    
  21.   p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow");    
  22.  }    
  23.   
  24. //pShowBrowser需要抓图的窗口的指针  
  25.  HWND hWnd=pShowBrowser->GetSafeHwnd();  
  26.     HDC hDC = ::GetWindowDC(hWnd);    
  27.     ASSERT(hDC);    
  28.         
  29.     HDC hMemDC = ::CreateCompatibleDC(hDC);    
  30.     ASSERT(hMemDC);    
  31.         
  32.     RECT rc;    
  33.     ::GetWindowRect(hWnd, &rc);    
  34.     
  35.     HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);   
  36.     ASSERT(hBitmap);    
  37.         
  38.     HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);    
  39.      p(hWnd, hMemDC, 0);  //抓图  
  40.     
  41.     BITMAP bitmap = {0};    
  42.     ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);    
  43.     BITMAPINFOHEADER bi = {0};    
  44.     BITMAPFILEHEADER bf = {0};    
  45.     
  46.     CONST int nBitCount = 24;    
  47.     bi.biSize = sizeof(BITMAPINFOHEADER);    
  48.     bi.biWidth = bitmap.bmWidth;    
  49.     bi.biHeight = bitmap.bmHeight;    
  50.     bi.biPlanes = 1;    
  51.     bi.biBitCount = nBitCount;    
  52.     bi.biCompression = BI_RGB;    
  53.     DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;   
  54.     
  55.     HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));    
  56.     LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);    
  57.     *lpbi = bi;    
  58.     ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);    
  59.     //用CaImage类实现bmp到jpeg的编码转换,并保存到内存文件  
  60.     try    
  61.     {     
  62.   CxImage image((BYTE*)lpbi,dwSize,CXIMAGE_FORMAT_BMP);//    
  63.   if (image.IsValid()){  
  64.    if(!image.IsGrayScale()) image.IncreaseBpp(24);   // param nbit: 4, 8, 24  
  65.    image.SetJpegQuality(99);                // 设置图像的压缩质量参数(从0到100,数值越大,质量越高)  
  66.    CxMemFile memfile;            // 显式使用CxMemFile对象  
  67.    memfile.Open();  
  68.    image.Encode(&memfile,CXIMAGE_FORMAT_JPG);//编码  
  69.    BYTE* buffer = memfile.GetBuffer();  
  70.    long size = memfile.Size();  
  71.    int result = -1;  
  72.   
  73. //设置gsoap参数  
  74.    xsd__base64Binary imag1;  
  75.    pBinary->__ptr = (unsigned char *)soap_malloc(pServiceSoap->soap, size); /*size为内存大小*/  
  76.    pBinary->__size=size;  
  77.    memset(pBinary->__ptr, 0, size);  
  78.    memcpy(pBinary->__ptr, buffer, size); /*src_ptr为源数据块指针*/  
  79.    free(buffer);  
  80.    memfile.Close();  
  81.   }  
  82.  }  
  83.     catch(CFileException* e)    
  84.     {    
  85.         e->ReportError();    
  86.         e->Delete();    
  87.     }    
  88.     
  89.     GlobalUnlock(hDib);    
  90.     GlobalFree(hDib);    
  91.     
  92.     ::SelectObject(hMemDC, hOldBmp);    
  93.     ::DeleteObject(hBitmap);        
  94.     ::DeleteObject(hMemDC);    
  95.     ::ReleaseDC(hWnd, hDC);    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多