c++ 截取屏幕图片并保存

    //获取桌面窗口的CDC
    CDC *pdeskdc = GetDesktopWindow()->GetDC();  
    CRect re;
    //获取窗口的大小
    GetDesktopWindow()->GetClientRect(&re);
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pdeskdc , re.Width() , re.Height());
    //创建一个兼容的内存画板
    CDC memorydc;
    memorydc.CreateCompatibleDC(pdeskdc);

    //选中画笔
    CBitmap *pold = memorydc.SelectObject(&bmp);

    //绘制图像
    memorydc.BitBlt(0,0,re.Width() ,re.Height(), pdeskdc , 0 ,0 ,SRCCOPY) ;

    //获取鼠标位置,然后添加鼠标图像
    CPoint po;
    GetCursorPos(&po);
    HICON hinco = (HICON)GetCursor();
    memorydc.DrawIcon(po.x-10 , po.y - 10 , hinco);
    //选中原来的画笔
    memorydc.SelectObject(pold);
    BITMAP bit;
    bmp.GetBitmap(&bit);
//    DWORD size = bit.bmWidth * bit.bmHeight ;

    //定义 图像大小(单位:byte)
    DWORD size = bit.bmWidthBytes * bit.bmHeight ;
    LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR , size) ;

    //后面是创建一个bmp文件的必须文件头,想要了解可以参考msdn
    
    BITMAPINFOHEADER pbitinfo;
    pbitinfo.biBitCount = 24 ; 
    pbitinfo.biClrImportant = 0;
    pbitinfo.biCompression = BI_RGB ;
    pbitinfo.biHeight = bit.bmHeight ; 
    pbitinfo.biPlanes = 1 ;
    pbitinfo.biSize = sizeof(BITMAPINFOHEADER);
    pbitinfo.biSizeImage =size;
    pbitinfo.biWidth = bit.bmWidth;
    pbitinfo.biXPelsPerMeter = 0;
    pbitinfo.biYPelsPerMeter = 0 ;

    GetDIBits(pdeskdc->m_hDC , bmp , 0 , pbitinfo.biHeight , lpdata , 
        (BITMAPINFO*)&pbitinfo,DIB_RGB_COLORS);

    BITMAPFILEHEADER bfh;
    bfh.bfReserved1 = bfh.bfReserved2 = 0 ;
    bfh.bfType = ((WORD)('M'<< 8)|'B');
    bfh.bfSize = 54 + size ; 
    bfh.bfOffBits = 54 ;
    
    //写入文件

    CFile file;
    if ( file.Open("1.bmp" , CFile::modeCreate|CFile::modeWrite) )
    {
        file.WriteHuge( &bfh , sizeof(BITMAPFILEHEADER) );
        file.WriteHuge(&pbitinfo , sizeof(BITMAPINFOHEADER));
        file.WriteHuge(lpdata , size);
        file.Close();
    }
    GlobalFree(lpdata);

 

posted @ 2015-06-05 00:18  何人之名  阅读(1093)  评论(0)    收藏  举报