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

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

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

创建子对话框的代码:

 pShowBrowser=new CShowBrowser();
 pShowBrowser->Create(IDD_SHOWBROWSER,this);
 pShowBrowser->MoveWindow(2000,1500,1024,768);//移到视区之外
 pShowBrowser->ShowWindow(SW_SHOW);
 pShowBrowser->Navigate(www.baidu.com);//导航到指定网站

//抓图并保存到内存,以被GSOAP发送到webservice服务端

// pBinary: webservice二进制参数指针

void CNetTestVDlg::SaveImagetoBinary(xsd__base64Binary* pBinary)
{

//对VC6.0来说PrintWindow,是隐藏函数,通过地址使用
 typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);   
 HMODULE h;  
 h = LoadLibrary( _T("user32.dll") );  
 pPrintWindow p;  
 if( h )  
 {  
  p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow");  
 }  

//pShowBrowser需要抓图的窗口的指针
 HWND hWnd=pShowBrowser->GetSafeHwnd();
    HDC hDC = ::GetWindowDC(hWnd);  
    ASSERT(hDC);  
      
    HDC hMemDC = ::CreateCompatibleDC(hDC);  
    ASSERT(hMemDC);  
      
    RECT rc;  
    ::GetWindowRect(hWnd, &rc);  
  
    HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top); 
    ASSERT(hBitmap);  
      
    HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);  
     p(hWnd, hMemDC, 0);  //抓图
  
    BITMAP bitmap = {0};  
    ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);  
    BITMAPINFOHEADER bi = {0};  
    BITMAPFILEHEADER bf = {0};  
  
    CONST int nBitCount = 24;  
    bi.biSize = sizeof(BITMAPINFOHEADER);  
    bi.biWidth = bitmap.bmWidth;  
    bi.biHeight = bitmap.bmHeight;  
    bi.biPlanes = 1;  
    bi.biBitCount = nBitCount;  
    bi.biCompression = BI_RGB;  
    DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight; 
  
    HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));  
    LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);  
    *lpbi = bi;  
    ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);  
    //用CaImage类实现bmp到jpeg的编码转换,并保存到内存文件
    try  
    {   
  CxImage image((BYTE*)lpbi,dwSize,CXIMAGE_FORMAT_BMP);//  
  if (image.IsValid()){
   if(!image.IsGrayScale()) image.IncreaseBpp(24);   // param nbit: 4, 8, 24
   image.SetJpegQuality(99);                // 设置图像的压缩质量参数(从0到100,数值越大,质量越高)
   CxMemFile memfile;            // 显式使用CxMemFile对象
   memfile.Open();
   image.Encode(&memfile,CXIMAGE_FORMAT_JPG);//编码
   BYTE* buffer = memfile.GetBuffer();
   long size = memfile.Size();
   int result = -1;

//设置gsoap参数
   xsd__base64Binary imag1;
   pBinary->__ptr = (unsigned char *)soap_malloc(pServiceSoap->soap, size); /*size为内存大小*/
   pBinary->__size=size;
   memset(pBinary->__ptr, 0, size);
   memcpy(pBinary->__ptr, buffer, size); /*src_ptr为源数据块指针*/
   free(buffer);
   memfile.Close();
  }
 }
    catch(CFileException* e)  
    {  
        e->ReportError();  
        e->Delete();  
    }  
  
    GlobalUnlock(hDib);  
    GlobalFree(hDib);  
  
    ::SelectObject(hMemDC, hOldBmp);  
    ::DeleteObject(hBitmap);      
    ::DeleteObject(hMemDC);  
    ::ReleaseDC(hWnd, hDC);  
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值