工作问题积累(六)截屏并且保存 VC++
2014-04-24 17:27
337 查看
void CQueenMainDlg::SavePicture(CString SaveFileName) { BeginWaitCursor(); BYTE *pPicData = NULL; //CDC *pDC = GetDC(); //1.当前显示的客户端窗口 CDC *pDC = CDC::FromHandle(::GetDC(NULL)); //2.整个屏幕 HDC pScrDC = pDC->GetSafeHdc(); HDC pMemDC = CreateCompatibleDC(pScrDC); int nBitsPixel = pDC->GetDeviceCaps(BITSPIXEL); //CRect rcWndRect; int width = pDC->GetDeviceCaps(HORZRES); int hight = pDC->GetDeviceCaps(VERTRES); DWORD nImageSize = width*hight*nBitsPixel/8; pPicData = new BYTE[nImageSize]; BITMAPINFOHEADER bmpinfoheader; memset(&bmpinfoheader,0,sizeof(bmpinfoheader)); bmpinfoheader.biSize = sizeof(bmpinfoheader); bmpinfoheader.biWidth = width; bmpinfoheader.biHeight = hight; bmpinfoheader.biBitCount = nBitsPixel; bmpinfoheader.biCompression = BI_RGB; bmpinfoheader.biPlanes = 1; bmpinfoheader.biSizeImage = nImageSize; //创建一个与屏幕设备描述表兼容的位图 HBITMAP hNewBit = CreateCompatibleBitmap(pScrDC,width,hight); //把新位图放到内存设备描述表中 HBITMAP hOldBit = (HBITMAP)SelectObject(pMemDC,hNewBit); //把屏幕设备表拷贝到内存设备表中 StretchBlt(pMemDC,0,0,width,hight,pScrDC,0,0,width,hight,SRCCOPY); //取得位图数据 GetDIBits(pMemDC,hNewBit,0,hight,pPicData,(LPBITMAPINFO)&bmpinfoheader,DIB_RGB_COLORS); //得到屏幕位图的句柄 SelectObject(pMemDC,hOldBit); //释放 ReleaseDC(pDC); DeleteDC(pMemDC); DeleteObject(hNewBit); if (pPicData) { DWORD nLineLen = (width*nBitsPixel+31)/32*4; DWORD nColSize = sizeof(RGBQUAD)*((nBitsPixel <= 8) ? 1<<nBitsPixel:0); DWORD nImgSize = sizeof(BITMAPINFOHEADER) + nColSize + (DWORD)(UINT)nLineLen*(DWORD)(UINT)hight; BITMAPFILEHEADER bmpfileheader; bmpfileheader.bfType = MAKEWORD('B','M'); bmpfileheader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nImgSize; bmpfileheader.bfReserved1 = bmpfileheader.bfReserved2 = 0; bmpfileheader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); BITMAPINFOHEADER BmpInfoHead; memset(&BmpInfoHead,0,sizeof(BITMAPINFOHEADER)); BmpInfoHead.biSize = sizeof(BITMAPINFOHEADER); BmpInfoHead.biWidth = width; BmpInfoHead.biHeight = hight; BmpInfoHead.biBitCount = nBitsPixel; BmpInfoHead.biCompression = BI_RGB; BmpInfoHead.biPlanes = 1; BmpInfoHead.biSizeImage = nImgSize-sizeof(BITMAPINFOHEADER)-nColSize; BmpInfoHead.biXPelsPerMeter = BmpInfoHead.biYPelsPerMeter = 0; BmpInfoHead.biClrUsed = (nBitsPixel <= 8) ? 1<<nBitsPixel:0; BmpInfoHead.biClrImportant = 0; CFile file; CString strXmlFile = theApp.m_strAppPath; strXmlFile += _T("skin\\"); file.SetFilePath(strXmlFile); if (file.Open(SaveFileName,CFile::modeCreate | CFile::modeWrite)) { file.Write(&bmpfileheader,sizeof(bmpfileheader)); file.Write(&BmpInfoHead,sizeof(BmpInfoHead)); file.Write(pPicData,nImgSize); file.Close(); } delete []pPicData; } EndWaitCursor(); SendTrack(); }
相关文章推荐
- 工作问题积累(十八)VC界面编程总结
- 工作问题积累(十一)如何解决"应用程序无法启动,因为应用程序的并行配置不正确"问题
- 工作问题积累(二十六)程序打开网页 ShellExecute
- 算法编程题积累(1)——网易笔试"工程师工作安排“问题
- 【酷熊科技】工作积累 ----------- android 6.0 权限问题
- 工作问题积累(五)有效解决丢失和已加载msvcp71.dll出错问题
- word嵌入vc时出现,保存的时候出现了些问题
- 工作碰到的问题解决积累
- 好长时间上不了博客,我还以为因为我发表抗日言论账户被删了,编程中好多新经验新发现不能拿出来和朋友们分享,那个急呀。以下是我在工作中积累的一些经验和解决的一些问题,希望能对大家有一点帮助。
- 纯SDK方式截屏并且保存为BMP格式
- 点滴积累【C#】---C#实现上传照片到物理路径,并且将地址保存到数据库,
- EVC实现WIN CE下截屏并且保存到文件
- 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
- EVC实现WIN CE下截屏并且保存到文件(转载)
- 纯SDK方式截屏并且保存为BMP格式 .
- 工作问题积累(二十七)复制功能(文本)
- 工作问题积累(二十三)CString在多线程下的安全问题
- VC中实现截屏并保存为.bmp格式的图片
- [工作积累] shadow map问题汇总
- 【酷熊科技】工作积累 ----------- Unity3D UITable协程加载问题 (转载 ---- 关于NGUI中UiTable和UIGrid脚本的一点感受)