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