1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > VC 全屏截图 局部截图

VC 全屏截图 局部截图

时间:2023-09-06 04:06:00

相关推荐

VC 全屏截图 局部截图

使用前 以下必须先设置

项目->属性->配置属性->常规->MFC的使用 选择“在共享 DLL 中使用 MFC”

代码如下

// vc截图.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <afxwin.h> //#include <Windows.h>HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域{HDC hScrDC, hMemDC;// 屏幕和内存设备描述表HBITMAP hBitmap,hOldBitmap; // 位图句柄int nX, nY, nX2, nY2;// 选定区域坐标int nWidth, nHeight;// 位图宽度和高度int xScrn, yScrn; // 屏幕分辨率// 确保选定区域不为空矩形if (IsRectEmpty(lpRect))return NULL;//为屏幕创建设备描述表hScrDC = CreateDCA("DISPLAY", NULL, NULL, NULL);//为屏幕设备描述表创建兼容的内存设备描述表hMemDC = CreateCompatibleDC(hScrDC);// 获得选定区域坐标nX = lpRect->left;nY = lpRect->top;nX2 = lpRect->right;nY2 = lpRect->bottom;// 获得屏幕分辨率xScrn = GetDeviceCaps(hScrDC, HORZRES);yScrn = GetDeviceCaps(hScrDC, VERTRES);//确保选定区域是可见的if (nX < 0)nX = 0;if (nY < 0)nY = 0;if (nX2 > xScrn)nX2 = xScrn;if (nY2 > yScrn)nY2 = yScrn;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);// 返回位图句柄return hBitmap;}int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄{//lpFileName 为位图文件名HDChDC; //设备描述表intiBits;//当前显示分辨率下每个像素所占字节数WORD wBitCount; //位图中每个像素所占字节数//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize, dwWritten;BITMAPBitmap; //位图属性结构BITMAPFILEHEADER bmfHdr; //位图文件头结构BITMAPINFOHEADER bi; //位图信息头结构 LPBITMAPINFOHEADER lpbi;//指向位图信息头结构HANDLEfh, hDib, hPal;HPALETTEhOldPal=NULL;//定义文件,分配内存句柄,调色板句柄//计算位图文件每个像素所占字节数hDC = CreateDCA("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 <= 24)wBitCount = 24;elsewBitCount = 32;//计算调色板大小if (wBitCount <= 8)dwPaletteSize=(1<<wBitCount)*sizeof(RGBQUAD);//设置位图信息头结构GetObject(hBitmap, 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;//为位图内容分配内存/*xxxxxxxx计算位图大小分解一下(解释一下上面的语句)xxxxxxxxxxxxxxxxxxxx //每个扫描行所占的字节数应该为4的整数倍,具体算法为:int biWidth = (Bitmap.bmWidth*wBitCount) / 32;if((Bitmap.bmWidth*wBitCount) % 32)biWidth++; //不是整数倍的加1biWidth *= 4;//到这里,计算得到的为每个扫描行的字节数。dwBmBitsSize = biWidth * Bitmap.bmHeight;//得到大小xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/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,hBitmap,0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi,DIB_RGB_COLORS);//恢复调色板 if (hOldPal){SelectPalette(hDC, hOldPal, TRUE);RealizePalette(hDC);::ReleaseDC(NULL, hDC);}//创建位图文件 fh=CreateFileA(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh==INVALID_HANDLE_VALUE)return FALSE;// 设置位图文件头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, sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize , &dwWritten, NULL); //清除 GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return TRUE;}int _tmain(int argc, _TCHAR* argv[]){CRect rect;GetWindowRect(FindWindow(NULL,L"计算器"),&rect);HBITMAP hMap = CopyScreenToBitmap(rect); SaveBitmapToFile(hMap,"C:\\局部截图.bmp"); //CRect rect;//rect.left = 0;//rect.top = 0;//rect.right = GetSystemMetrics(SM_CXSCREEN);//rect.bottom = GetSystemMetrics(SM_CYSCREEN);//HBITMAP hMap = CopyScreenToBitmap(rect); //SaveBitmapToFile(hMap,"C:\\全屏截图.bmp"); return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。