PrintWindow函數、CxImage、GSOAP實現隱藏視窗抓圖到JPEG並通過webservice傳至伺服器

來源:互聯網
上載者:User

類似於快照功能,前提是將需要抓圖的視窗移到視區之外實現隱藏,並不是將視窗屬性設為不可見,我的模組是在對話方塊子表單中開啟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);  }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.