电竞比分网-中国电竞赛事及体育赛事平台

分享

PrintWindow函數(shù)、CxImage、GSOAP實(shí)現(xiàn)隱藏窗口抓圖到JPEG并通過(guò)webservice傳至服務(wù)器

 quasiceo 2015-08-06

PrintWindow函數(shù)、CxImage、GSOAP實(shí)現(xiàn)隱藏窗口抓圖到JPEG并通過(guò)webservice傳至服務(wù)器

分類(lèi): CxImage 1389人閱讀 評(píng)論(0) 收藏 舉報(bào)

類(lèi)似于快照功能,前提是將需要抓圖的窗口移到視區(qū)之外實(shí)現(xiàn)隱藏,并不是將窗口屬性設(shè)為不可見(jiàn),我的模塊是在對(duì)話框子窗體中打開(kāi)ie控件,瀏覽到指定網(wǎng)站并截圖。

因此主窗體生成非模態(tài)對(duì)話框,該子對(duì)話框內(nèi)嵌ie控件,并將該子對(duì)話框移到可視區(qū)域之外,環(huán)境依然是VC6.0。

創(chuàng)建子對(duì)話框的代碼:

  1.  pShowBrowser=new CShowBrowser();  
  2.  pShowBrowser->Create(IDD_SHOWBROWSER,this);  
  3.  pShowBrowser->MoveWindow(2000,1500,1024,768);//移到視區(qū)之外  
  4.  pShowBrowser->ShowWindow(SW_SHOW);  
  5.  pShowBrowser->Navigate(www.baidu.com);//導(dǎo)航到指定網(wǎng)站  
  6.   
  7. //抓圖并保存到內(nèi)存,以被GSOAP發(fā)送到webservice服務(wù)端  
  8.   
  9. // pBinary: webservice二進(jìn)制參數(shù)指針  
  10.   
  11. void CNetTestVDlg::SaveImagetoBinary(xsd__base64Binary* pBinary)  
  12. {  
  13.   
  14. //對(duì)VC6.0來(lái)說(shuō)PrintWindow,是隱藏函數(shù),通過(guò)地址使用  
  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類(lèi)實(shí)現(xiàn)bmp到j(luò)peg的編碼轉(zhuǎn)換,并保存到內(nèi)存文件  
  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);                // 設(shè)置圖像的壓縮質(zhì)量參數(shù)(從0到100,數(shù)值越大,質(zhì)量越高)  
  66.    CxMemFile memfile;            // 顯式使用CxMemFile對(duì)象  
  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. //設(shè)置gsoap參數(shù)  
  74.    xsd__base64Binary imag1;  
  75.    pBinary->__ptr = (unsigned char *)soap_malloc(pServiceSoap->soap, size); /*size為內(nèi)存大小*/  
  76.    pBinary->__size=size;  
  77.    memset(pBinary->__ptr, 0, size);  
  78.    memcpy(pBinary->__ptr, buffer, size); /*src_ptr為源數(shù)據(jù)塊指針*/  
  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);    

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多