HBITMAP CopyScreenToBitmap(int &nWidth, int &nHeight)
{ // 屏幕和內(nèi)存設(shè)備描述表 HDC hScrDC, hMemDC; // 位圖句柄 HBITMAP hBitmap, hOldBitmap; // 屏幕分辨率 int xScrn, yScrn; //為屏幕創(chuàng)建設(shè)備描述表 hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); //為屏幕設(shè)備描述表創(chuàng)建兼容的內(nèi)存設(shè)備描述表 hMemDC = CreateCompatibleDC(hScrDC); // 獲得屏幕分辨率 xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //存儲(chǔ)屏幕的長(zhǎng)寬 nWidth = xScrn; nHeight = yScrn; // 創(chuàng)建一個(gè)與屏幕設(shè)備描述表兼容的位圖 hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn); // 把新位圖選到內(nèi)存設(shè)備描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中 BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY); SaveDCToBMP(hMemDC,0,0,nWidth,nHeight,_T("\\TheScreen.bmp")); //得到屏幕位圖的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hScrDC); DeleteDC(hMemDC); // 返回位圖句柄 return hBitmap; } BOOL SaveDCToBMP(HDC hDC,int nStartX,int nStartY,int nWidth,int nHeight,LPCTSTR szFileName) { //定義圖形色深 int iPixel = 32; //位圖信息頭 LPBITMAPINFO lpbmih = new BITMAPINFO; lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbmih->bmiHeader.biWidth = nWidth; lpbmih->bmiHeader.biHeight = nHeight; lpbmih->bmiHeader.biPlanes = 1; lpbmih->bmiHeader.biBitCount = iPixel; lpbmih->bmiHeader.biCompression = BI_RGB; lpbmih->bmiHeader.biSizeImage = 0; lpbmih->bmiHeader.biXPelsPerMeter = 0; lpbmih->bmiHeader.biYPelsPerMeter = 0; lpbmih->bmiHeader.biClrUsed = 0; lpbmih->bmiHeader.biClrImportant = 0; lpbmih->bmiColors[1].rgbBlue=8; lpbmih->bmiColors[1].rgbGreen =8; lpbmih->bmiColors[1].rgbRed =8; lpbmih->bmiColors[1].rgbReserved =8; //創(chuàng)建位圖數(shù)據(jù) HDC hdcMem; HBITMAP hBitMap = NULL; CBitmap *pBitMap = NULL; CDC *pMemDC = NULL; //BYTE *pBits; //hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0); LPVOID pBits; hdcMem = CreateCompatibleDC(hDC); hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_RGB_COLORS,&pBits,NULL,0); if(!hBitMap) { CString lpMsgBuf="init error str(frx savebmp)"; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, // Default language (LPTSTR)(LPCTSTR)lpMsgBuf, 0, NULL ); AfxMessageBox((LPCTSTR)lpMsgBuf); // Free the buffer. return false; } pBitMap = new CBitmap; pBitMap->Attach(hBitMap); pMemDC = new CDC; pMemDC->Attach(hdcMem); pMemDC->SelectObject(pBitMap); pMemDC->BitBlt(0,0,nWidth,nHeight,CDC::FromHandle(hDC),nStartX,nStartY,SRCCOPY); BITMAPFILEHEADER bmfh;//位圖文件頭 ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER)); *((char *)&bmfh.bfType) = 'B'; *(((char *)&bmfh.bfType) + 1) = 'M'; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bmfh.bfSize = bmfh.bfOffBits + (nWidth * nHeight) * iPixel / 8; int iBMPBytes = nWidth * nHeight * iPixel / 8; CFile file; if(file.Open(szFileName,CFile::modeWrite | CFile::modeCreate)) { file.Write(&bmfh,sizeof(BITMAPFILEHEADER)); file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER)); file.Write(pBits,iBMPBytes); file.Close(); } else return false; DeleteObject(hBitMap); DeleteObject(hDC); pMemDC->DeleteDC(); delete pMemDC; pMemDC = NULL; delete pBitMap; pBitMap = NULL; delete lpbmih; lpbmih = NULL; return true; } CopyScreenToBitmap是將當(dāng)前屏幕保存為圖片的代碼。 SaveDCToBMP是將DC保存為圖片文件的公用函數(shù),。 |
|