MFC中怎樣把抓取到的位圖保存到指定文件中

 

void CSCREENSNAP2Dlg::toClipboard(CWnd *wnd, BOOL FullWnd)
{
/* CDC dc;
 if(FullWnd){
  HDC hdc=::GetWindowDC(wnd->m_hWnd);
  dc.Attach(hdc);
 }
 else{ 
  HDC hdc=::GetDC(wnd->m_hWnd);
  dc.Attach(hdc);
 }
 */
 ////////////////////////////////////
 CDC *dc;
 if(FullWnd)
  dc=new CWindowDC(wnd);  //抓取整個窗口
 else
  dc=new CClientDC(wnd);  //僅抓取客戶區區域
 ///////////////////////////////////
 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);
 SaveToFile("f:\\heihei.tmp",bm,*dc); //保存到指定文件中,必須在bm.Detach()之前保存纔有效
 bm.Detach();
}

 

bool CSCREENSNAP2Dlg::CaptureWindowToClipboard(HWND hwndToCapture)
{
 bool bRet=false;
 if((hwndToCapture) && (::IsWindow(hwndToCapture) ) )
 {
  bRet=true;
  toClipboard((CWnd *)CWnd::FromHandle(hwndToCapture),true);
 }
 return bRet;
}

 

long CSCREENSNAP2Dlg::SaveToFile(LPTSTR pszFile, HBITMAP hBMP, HDC hDC)
{
    HANDLE hf;
    BITMAPFILEHEADER hdr;
    PBITMAPINFOHEADER pbih;
    LPBYTE lpBits;
    DWORD dwTotal;
    DWORD cb;
    BYTE *hp;
    DWORD dwTmp;
    BITMAP bmp;
    PBITMAPINFO pbi;
 WORD    cClrBits;

 if (!GetObject(hBMP, sizeof(BITMAP), (LPSTR)&bmp))
        return 0;

    cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
    if (cClrBits == 1)
        cClrBits = 1;
    else if (cClrBits <= 4)
        cClrBits = 4;
    else if (cClrBits <= 8)
        cClrBits = 8;
    else if (cClrBits <= 16)
        cClrBits = 16;
    else if (cClrBits <= 24)
        cClrBits = 24;
    else cClrBits = 32;
 
 if (cClrBits != 24)
 {
  pbi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) +
   sizeof(RGBQUAD) * (1<< cClrBits));
 }
 else
  pbi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));
 
    pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbi->bmiHeader.biWidth = bmp.bmWidth;
    pbi->bmiHeader.biHeight = bmp.bmHeight;
    pbi->bmiHeader.biPlanes = bmp.bmPlanes;
    pbi->bmiHeader.biBitCount = bmp.bmBitsPixel;
    if (cClrBits < 24)
        pbi->bmiHeader.biClrUsed = (1<<cClrBits);
 
    pbi->bmiHeader.biCompression = BI_RGB;
    pbi->bmiHeader.biSizeImage = ((pbi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
  * pbi->bmiHeader.biHeight;
 pbi->bmiHeader.biClrImportant = 0;

    pbih = (PBITMAPINFOHEADER) pbi;
    lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
 
    if (!lpBits)
  return E_FAIL;
 
    if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
        DIB_RGB_COLORS))
    {
  return E_FAIL;
    }
 
    hf = CreateFile(pszFile,
  GENERIC_READ | GENERIC_WRITE,
  (DWORD) 0,
  NULL,
  CREATE_ALWAYS,
  FILE_ATTRIBUTE_NORMAL,
  (HANDLE) NULL);
    if (hf == INVALID_HANDLE_VALUE)
  return E_FAIL;
    hdr.bfType = 0x4d42;
    hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
  pbih->biSize + pbih->biClrUsed
  * sizeof(RGBQUAD) + pbih->biSizeImage);
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;
 
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
  pbih->biSize + pbih->biClrUsed
  * sizeof (RGBQUAD);
 
    if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
        (LPDWORD) &dwTmp,  NULL))
    {
  return E_FAIL;
    }
 
    if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
  + pbih->biClrUsed * sizeof (RGBQUAD),
  (LPDWORD) &dwTmp, ( NULL)) )
  return E_FAIL;
 
    dwTotal = cb = pbih->biSizeImage;
    hp = lpBits;
    if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
  return E_FAIL;
 
 CloseHandle(hf);
    GlobalFree((HGLOBAL)lpBits);
 LocalFree(pbi);

 return S_OK;
}

 

發佈了75 篇原創文章 · 獲贊 14 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章