MFC 抓取窗口或屏幕位图 并保存

 //复制到剪贴板  
  void   toClipboard(CWnd   *   wnd,   BOOL   FullWnd)  
          {  
            CDC   dc;  
            if(FullWnd)  
                  {   /*   full   window   */  
                    HDC   hdc   =   ::GetWindowDC(wnd->m_hWnd);  
                    dc.Attach(hdc);  
                  }   /*   full   window   */  
            else  
                  {   /*   client   area   only   */  
                    HDC   hdc   =   ::GetDC(wnd->m_hWnd);  
                    dc.Attach(hdc);  
                  }   /*   client   area   only   */  
   
            CDC   memDC;  
            memDC.CreateCompatibleDC(&dc);  
   
            CBitmap   bm;  
            CRect   r;  
            if(FullWnd)  
                  wnd->GetWindowRect(&r);  
            else  
                    wnd->GetClientRect(&r);  
   
            CString   s;  
            wnd->GetWindowText(s);  
            CSize   sz(r.Width(),   r.Height());  
            bm.CreateCompatibleBitmap(&dc,   sz.cx,   sz.cy);  
            CBitmap   *   oldbm   =   memDC.SelectObject(&bm);  
            memDC.BitBlt(0,   0,   sz.cx,   sz.cy,   &dc,   0,   0,   SRCCOPY);  
   
            wnd->OpenClipboard();//  
            ::EmptyClipboard();  
            ::SetClipboardData(CF_BITMAP,   bm.m_hObject);  
            CloseClipboard();  
   
            memDC.SelectObject(oldbm);  
            bm.Detach();     //   make   sure   bitmap   not   deleted   with   CBitmap   object  
          }  
   
  //--------------  
  int   SaveBitmapToFile(HBITMAP   hBitmap   ,    
          LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄  
  {                   //lpFileName   为位图文件名  
          HDC                         hDC;               //设备描述表  
              int                         iBits;             // 当前显示分辨率下每个像素所占字节数  
          WORD                         wBitCount;        
                //位图中每个像素所占字节数  
              //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
          DWORD                       dwPaletteSize=0,  
                                  dwBmBitsSize,  
                                    dwDIBSize,   dwWritten;  
          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   if   (iBits   〈   =   24)  
              wBitCount   =   24;  
        //计算调色板大小  
        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   ;  
        //为位图内容分配内存  
        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,   hPal,   FALSE);  
              RealizePalette(hDC);  
        }  
        //   获取该调色板下新的像素值  
        GetDIBits(hDC,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,  
            (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)  
          +dwPaletteSize,  
            (BITMAPINFOHEADER   *)  
          lpbi,   DIB_RGB_COLORS);  
        //恢复调色板        
        if   (hOldPal)  
        {  
              SelectPalette(hDC,   hOldPal,   TRUE);  
              RealizePalette(hDC);  
              ReleaseDC(NULL,   hDC);  
        }  
        //创建位图文件          
  fh   =   CreateFile(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,   dwDIBSize,         &dwWritten,   NULL);  
        //清除        
        GlobalUnlock(hDib);  
        GlobalFree(hDib);  
        CloseHandle(fh);  
  }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值