VC屏幕截图,保存为Bmp文件
生活随笔
收集整理的這篇文章主要介紹了
VC屏幕截图,保存为Bmp文件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
新建一個(gè)MFC基于對(duì)話框的應(yīng)用程序,在界面上放一個(gè)Button,為其實(shí)現(xiàn)點(diǎn)擊事件,代碼如下:
void CScreenShotDlg::OnBtnScreenshot() {RECT rect = {0, 0, 1900, 1000};HBITMAP hbmp = CopyScreenToBitmap(&rect);SaveBitmapToFile(hbmp, "a.bmp");MessageBox("Save bmp file Successful"); }被調(diào)用的這兩個(gè)函數(shù)實(shí)現(xiàn)如下: HBITMAP CopyScreenToBitmap(LPRECT lpRect) {HDC hScrDC, hMemDC; // 屏幕和內(nèi)存設(shè)備描述表HBITMAP hBitmap, hOldBitmap; // 位圖句柄int nX, nY, nX2, nY2; // 選定區(qū)域坐標(biāo)int nWidth, nHeight; // 位圖寬度和高度int xScrn, yScrn; // 屏幕分辨率if (IsRectEmpty(lpRect))return NULL;hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); // 為屏幕創(chuàng)建設(shè)備描述表hMemDC = CreateCompatibleDC(hScrDC); // 為屏幕設(shè)備描述表創(chuàng)建兼容的內(nèi)存設(shè)備描述表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); // 創(chuàng)建一個(gè)與屏幕設(shè)備描述表兼容的位圖hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把新位圖選到內(nèi)存設(shè)備描述表中BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); // 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); // 得到屏幕位圖的句柄DeleteDC(hScrDC);DeleteDC(hMemDC);return hBitmap; }/*lpFileName: 位圖文件名 */ BOOL SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) {HDC hDC; // 設(shè)備描述表int iBits; // 當(dāng)前顯示分辨率下每個(gè)像素所占字節(jié)數(shù)WORD wBitCount; // 位圖中每個(gè)像素所占字節(jié)數(shù)DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten; // 調(diào)色板大小,位圖數(shù)據(jù)大小,位圖文件大小,寫入文件字節(jié)數(shù)BITMAP Bitmap; //位圖屬性結(jié)構(gòu)BITMAPFILEHEADER bmfHdr; // 位圖文件頭BITMAPINFOHEADER bi; // 位圖信息頭LPBITMAPINFOHEADER lpbi; // 指向位圖信息頭結(jié)構(gòu)HANDLE fh, hDib; // 定義文件,分配內(nèi)存句柄HPALETTE hPal, hOldPal=NULL; // 調(diào)色板句柄// 計(jì)算位圖文件每個(gè)像素所占字節(jié)數(shù)hDC = CreateDC("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); // 計(jì)算調(diào)色板大小// 設(shè)置位圖信息頭結(jié)構(gòu)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;hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); // 為位圖內(nèi)容分配內(nèi)存lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);*lpbi = bi;// 處理調(diào)色板hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);if (hPal){hDC = GetDC(NULL);hOldPal = SelectPalette(hDC, hPal, FALSE);RealizePalette(hDC);}// 獲取該調(diào)色板下新的像素值GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);if (hOldPal) // 恢復(fù)調(diào)色板{SelectPalette(hDC, hOldPal, TRUE);RealizePalette(hDC);ReleaseDC(NULL, hDC);}// 創(chuàng)建位圖文件 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return FALSE;// 設(shè)置位圖文件頭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); // 寫入位圖文件其余內(nèi)容GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return TRUE; }
總結(jié)
以上是生活随笔為你收集整理的VC屏幕截图,保存为Bmp文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 王道考研——计算机网络------笔记
- 下一篇: s3c2440移植MQTT