VC将屏幕区域保存为图片[转]

VC将屏幕区域保存为图片,该代码为网上搜集整理。

  1 int   CDlldemoDlg::SaveBitmapToFile(HBITMAP   hBitmap,   LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄   
  2 {           //lpFileName   为位图文件名   
  3     WORD   wBitCount;   //位图中每个像素所占字节数     
  4     
  5     //定义调色板大小,位图中像素字节大小,位图文件大小,写入文件字节数     
  6     DWORD   dwPaletteSize=0,dwBmBitsSize,dwDIBSize,   dwWritten;     
  7     BITMAP   Bitmap; //位图属性结构     
  8     BITMAPFILEHEADER   bmfHdr;   //位图文件头结构     
  9     BITMAPINFOHEADER   bi;   //位图信息头结构     
 10     HANDLE   fh;   //定义文件,分配内存句柄,调色板句柄   
 11     LPSTR   lpbk,lpmem;   
 12     
 13     wBitCount   =   32;     
 14     //设置位图信息头结构     
 15     GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);     
 16     bi.biSize   =   sizeof(BITMAPINFOHEADER);     
 17     bi.biWidth   =   Bitmap.bmWidth;     
 18     bi.biHeight   =   Bitmap.bmHeight; //为负,正向的位图;为正,倒向的位图   
 19     bi.biPlanes   =   1;     
 20     bi.biBitCount   =   wBitCount;     
 21     bi.biCompression   =   BI_RGB;     
 22     bi.biSizeImage=0;     
 23     bi.biXPelsPerMeter=0;     
 24     bi.biYPelsPerMeter=0;     
 25     bi.biClrUsed=0;     
 26     bi.biClrImportant=0;     
 27     dwBmBitsSize=((Bitmap.bmWidth*wBitCount+31)/32)*4*Bitmap.bmHeight;     
 28     
 29     //创建位图文件     
 30     fh   =   CreateFile(lpFileName,   GENERIC_WRITE,   0,   NULL,   CREATE_ALWAYS,     
 31         FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);     
 32     if   (fh   ==   INVALID_HANDLE_VALUE)     
 33         return   FALSE;     
 34     //设置位图文件头     
 35     bmfHdr.bfType   =   0x4D42;   //   "BM"     
 36     dwDIBSize   =   sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBmBitsSize;     
 37     bmfHdr.bfSize   =   dwDIBSize;     
 38     bmfHdr.bfReserved1   =   0;     
 39     bmfHdr.bfReserved2   =   0;     
 40     bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER);   
 41     
 42     //写入位图文件头     
 43     WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),&dwWritten,   NULL);     
 44     //写入位图信息头   
 45     WriteFile(fh,   (LPSTR)&bi,sizeof(BITMAPINFOHEADER),&dwWritten,   NULL);   
 46     
 47     //获取位图阵列   
 48     lpmem=new   char[dwBmBitsSize];   
 49     lpbk=(LPSTR)   new   char[dwBmBitsSize];   
 50     GetBitmapBits(hBitmap,dwBmBitsSize,lpmem);//正向的内存图象数据   
 51     
 52     //转化为倒向数据(仅在bmHeight为正时需要)   
 53     for(int   i=0;i<Bitmap.bmHeight;i++)   
 54     {   
 55         memcpy(lpbk+Bitmap.bmWidth*i*4,lpmem+Bitmap.bmWidth*(Bitmap.bmHeight-i-1)*4,Bitmap.bmWidth*4);   
 56     }   
 57     //写位图数据   
 58     WriteFile(fh,   lpbk,dwBmBitsSize,&dwWritten,   NULL);   
 59     
 60     //清除     
 61     delete   []lpbk;   
 62     delete   []lpmem;   
 63     
 64     CloseHandle(fh);   
 65     return   TRUE;   
 66     
 67 }
 68 HBITMAP   CDlldemoDlg::CopyScreenToBitmap(LPRECT   lpRect)   //lpRect   代表选定区域   
 69 {   
 70     HDC   hScrDC,hMemDC; //屏幕和内存设备描述表   
 71     HBITMAP   hBitmap,hOldBitmap;//位图句柄   
 72     int   nX,nY,nX2,nY2; //选定区域坐标   
 73     int   nWidth,nHeight; //位图宽度和高度   
 74     int   xScrn,yScrn; //屏幕宽度和高度   
 75     
 76     //确保选定区域不为空矩形   
 77     if(IsRectEmpty(lpRect))     
 78         return   NULL;     
 79     
 80     //为屏幕创建设备描述表   
 81     hScrDC=CreateDC("DISPLAY",   NULL,   NULL,   NULL);   
 82     //为屏幕设备描述表创建兼容的内存设备描述表   
 83     hMemDC=CreateCompatibleDC(hScrDC);   //或者::CreateCompatibleDC(NULL)   
 84     
 85     //获得选定区域坐标     
 86     nX=lpRect->left;   
 87     nY=lpRect->top;   
 88     nX2=lpRect->right;   
 89     nY2=lpRect->bottom;     
 90     
 91     //获得屏幕宽度和高度   
 92     xScrn=GetDeviceCaps(hScrDC,HORZRES);   
 93     yScrn=GetDeviceCaps(hScrDC,VERTRES);     
 94     
 95     //确保选定区域是可见的   
 96     if   (nX<0)   
 97         nX=0;   
 98     if   (nY<0)   
 99         nY=0;   
100     if   (nX2>xScrn)   
101         nX2=xScrn;     
102     if   (nY2>yScrn)   
103         nY2=yScrn;     
104     
105     nWidth=nX2-nX;     
106     nHeight=nY2-nY;   
107     
108     //创建一个与屏幕设备描述表兼容的位图     
109     hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);     
110     
111     //把新位图选到内存设备描述表中     
112     hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);   
113     
114     //把屏幕设备描述表拷贝到内存设备描述表中   
115     BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);   
116     
117     //得到屏幕位图的句柄   
118     hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);   
119     
120     //清除   
121     DeleteDC(hScrDC);   
122     DeleteDC(hMemDC);   
123     return   hBitmap;   //返回位图句柄  
124 }   
原文地址:https://www.cnblogs.com/zhouwenJS/p/3763100.html