VC抓屏并保存成BMP文件

废话少说,之间上代码:

BOOL SaveScreenToBitmap(CString strFileName)
{
    CDC dc;
    dc.CreateDC("DISPLAY", NULL, NULL, NULL);
    CBitmap bm;
    int Width = GetSystemMetrics(SM_CXSCREEN);
    int Height = GetSystemMetrics(SM_CYSCREEN);
    bm.CreateCompatibleBitmap(&dc, Width, Height);
    CDC tdc;
    tdc.CreateCompatibleDC(&dc);
    CBitmap* pOld = tdc.SelectObject(&bm);
    tdc.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY);
    tdc.SelectObject(pOld);
    BITMAP btm;
    bm.GetBitmap(&btm);
    DWORD size = btm.bmWidthBytes * btm.bmHeight;
    LPSTR lpData = (LPSTR)GlobalAlloc(GPTR, size);
    
    BITMAPINFOHEADER bih;
    bih.biBitCount = btm.bmBitsPixel;
    bih.biClrImportant = 0;
    bih.biClrUsed = 0;
    bih.biCompression = 0;
    bih.biHeight = btm.bmHeight;
    bih.biPlanes = 1;
    bih.biSize = sizeof(BITMAPINFOHEADER);
    bih.biSizeImage = size;
    bih.biWidth = btm.bmWidth;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;
    
    GetDIBits(dc, bm, 0, bih.biHeight, lpData, (BITMAPINFO *)&bih, DIB_RGB_COLORS);
    
    BITMAPFILEHEADER bfh;
    bfh.bfReserved1 = bfh.bfReserved2 = 0;
    bfh.bfType = ((WORD)('M' << 8) | 'B');
    bfh.bfSize = 54 + size;
    bfh.bfOffBits = 54;
    CFile bf;
    if (bf.Open(strFileName, CFile::modeCreate | CFile::modeWrite))
    {
        bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
        bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
        bf.WriteHuge(lpData, size);
        bf.Close();
    }
    else
    {
        return FALSE;
    }
    
    GlobalFree(lpData);
    
    return TRUE;
} 

 

posted on 2013-05-09 16:22  onedime  阅读(459)  评论(0编辑  收藏  举报