类似于快照功能,前提是将需要抓图的窗口移到视区之外实现隐藏,并不是将窗口属性设为不可见,我的模块是在对话框子窗体中打开ie控件,浏览到指定网站并截图。
因此主窗体生成非模态对话框,该子对话框内嵌ie控件,并将该子对话框移到可视区域之外,环境依然是VC6.0。
创建子对话框的代码:
@H_404_12@ 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,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,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); }版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。