vc怎么截屏并把截取的图片保存到c盘
vc如何截屏并把截取的图片保存到c盘
各位大虾请问 vc如何截屏并把截取的图片保存到c盘?非常感谢!!!!!!
------解决方案--------------------
各位大虾请问 vc如何截屏并把截取的图片保存到c盘?非常感谢!!!!!!
------解决方案--------------------
- C/C++ code
void SaveBitmapToFile(HBITMAP hBmp, LPCWSTR lpfilename) { HDC hdc; //设备描述表 int ibits; WORD wbitcount; //当前显示分辨率下每个像素所占字节数 //位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数 DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten; BITMAP bitmap; //位图属性结构 BITMAPFILEHEADER bmfhdr; //位图文件头结构 BITMAPINFOHEADER bi; //位图信息头结构 LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 //定义文件,分配内存句柄,调色板句柄 HANDLE fh, hdib, hpal, holdpal=NULL; //计算位图文件每个像素所占字节数 hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL); ibits = GetDeviceCaps(hdc, BITSPIXEL) * GetDeviceCaps(hdc, PLANES); DeleteDC(hdc); if (ibits <= 1) wbitcount = 1; else if (ibits <= 4) wbitcount = 4; else if (ibits <= 8) wbitcount = 8; else if (ibits <= 16) wbitcount = 16; else if (ibits <= 24) wbitcount = 24; else wbitcount = 32; //计算调色板大小 if (wbitcount <= 8) dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD); //设置位图信息头结构 GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bitmap.bmWidth; bi.biHeight = bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wbitcount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwbmbitssize = ((bitmap.bmWidth * wbitcount+31)/32)* 4 * bitmap.bmHeight ; //为位图内容分配内存 hdib = GlobalAlloc(GHND,dwbmbitssize + dwpalettesize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hdib); *lpbi = bi; // 处理调色板 hpal = GetStockObject(DEFAULT_PALETTE); if (hpal) { hdc = ::GetDC(NULL); holdpal = SelectPalette(hdc, (HPALETTE)hpal, false); RealizePalette(hdc); } // 获取该调色板下新的像素值 GetDIBits(hdc, hBmp, 0, (UINT) bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwpalettesize,(BITMAPINFO*)lpbi, DIB_RGB_COLORS); //恢复调色板 if (holdpal) { SelectPalette(hdc, (HPALETTE)holdpal, true); RealizePalette(hdc); ::ReleaseDC(NULL, hdc); } //创建位图文件 fh = CreateFile(lpfilename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL| FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return; // 设置位图文件头 bmfhdr.bfType = 0x4d42; // "bm" dwdibsize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwpalettesize + dwbmbitssize; bmfhdr.bfSize = dwdibsize; bmfhdr.bfReserved1 = 0; bmfhdr.bfReserved2 = 0; bmfhdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwpalettesize; // 写入位图文件头 WriteFile(fh, (LPSTR)&bmfhdr, sizeof(BITMAPFILEHEADER), &dwwritten, NULL); // 写入位图文件其余内容 WriteFile(fh, (LPSTR)lpbi, dwdibsize, &dwwritten, NULL); //清除 GlobalUnlock(hdib); GlobalFree(hdib); CloseHandle(fh); } HBITMAP CopyScreenToBitmap(LPRECT lpRect,BOOL bSave) //lpRect 代表选定区域 { HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; //为屏幕创建设备描述表 hScrDC = CreateDC(L"DISPLAY", NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; //获取屏幕分辩率 int nxScreen = GetSystemMetrics(SM_CXSCREEN); int nyScreen = GetSystemMetrics(SM_CYSCREEN); //确保选定区域是可见的 if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > nxScreen) nX2 = nxScreen; if (nY2 > nyScreen) nY2 = nyScreen; nWidth = nX2 - nX; nHeight = nY2 - nY; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap (hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY); hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); DeleteDC(hScrDC); DeleteDC(hMemDC); ::SaveBitmapToFile(hBitmap, _T("C:\\截图.bmp"));//这个函数楼上有 // 返回位图句柄 return hBitmap; }