您的位置:首页 > 其它

MFC中怎样把抓取到的位图保存到指定文件中

2011-11-07 15:02 531 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐