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;
} 

 

转载于:https://www.cnblogs.com/onedime/archive/2013/05/09/3069243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值