MFC保存全屏函数

来源:互联网 发布:qq旋风 for mac 编辑:程序博客网 时间:2024/06/05 19:36
//VC下把HBITMAP保存为bmp图片   BOOL  CMainWnd::SaveHBITMAPToBmp(HBITMAP hBitmap,CString FileName)      {         HDC     hDC;         //当前分辨率下每象素所占字节数         int     iBits;         //位图中每象素所占字节数         WORD     wBitCount;         //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数             DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;             //位图属性结构             BITMAP     Bitmap;                 //位图文件头结构         BITMAPFILEHEADER     bmfHdr;                 //位图信息头结构             BITMAPINFOHEADER     bi;                 //指向位图信息头结构                 LPBITMAPINFOHEADER     lpbi;                 //定义文件,分配内存句柄,调色板句柄             HANDLE     fh,   hDib,   hPal,hOldPal=NULL;             //计算位图文件每个像素所占字节数             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                                                                                                                               wBitCount  = 24;             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.biClrImportant = 0;         bi.biClrUsed =  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,hBitmap, 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(FileName,   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,   dwDIBSize,   &dwWritten,   NULL);             //清除                 GlobalUnlock(hDib);             GlobalFree(hDib);             CloseHandle(fh);             return     TRUE;         }  HBITMAP CMainWnd::CopyScreenToBitmap(){ CRect lpRect;CWnd *pWnd = GetForegroundWindow();//这里可以指定自己想要的CWND控件指针if ( !pWnd ){pWnd = GetDesktopWindow();if ( !pWnd ){return NULL;}}pWnd->GetWindowRect(lpRect);//确保区域不为空矩形if ( IsRectEmpty( lpRect ) ){return NULL;}//为屏幕创建设备描述表 HDC hScrdc = CreateDC( "DISPLAY", NULL, NULL, NULL ); //为屏幕设备描述表创建兼容的内存设备描述表HDC hMemdc = CreateCompatibleDC( hScrdc );//   获得选定区域坐标 int iX = lpRect.left; int iY = lpRect.top; int iX2 = lpRect.right; int iY2 = lpRect.bottom; //   获得屏幕分辨率int ixScrn = GetDeviceCaps( hScrdc, HORZRES ); int iyScrn = GetDeviceCaps( hScrdc, VERTRES ); //确保选定区域是可见的 if ( iX < 0 ){iX = 0;}if ( iY < 0 ){iY = 0;}if ( iX2 > ixScrn ){iX2 = ixScrn;}if ( iY2 > iyScrn ){iY2 = iyScrn;}int iWidth = iX2 - iX; int iHeight = iY2 - iY; //创建一个与屏幕设备描述表兼容的位图HBITMAP hBitmap = CreateCompatibleBitmap( hScrdc, iWidth, iHeight ); //把新位图选到内存设备描述表中HBITMAP hOldMap = (HBITMAP)SelectObject( hMemdc, hBitmap ); BitBlt( hMemdc, 0, 0, iWidth, iHeight, hScrdc, iX, iY, SRCCOPY );   //清除SelectObject( hMemdc, hOldMap );DeleteDC( hScrdc );DeleteDC( hMemdc );//返回位图句柄return hBitmap; }
void CMainWnd::OnSaveScreen()
{
<span style="white-space:pre"></span>HBITMAP Hbitmap = CopyScreenToBitmap();<span style="white-space:pre"></span>SaveHBITMAPToBmp(Hbitmap,"E:\\");
}

0 0
原创粉丝点击