VC简单的截图实现

第一、首先用CreateDC函数建设备上下文环境(创建设备描述表),名为display。
第二、用CreateCompatibleDC函数创建display设备兼容的内存设备上下文环境(DC)(创建兼容的内存设备描述表)。
第三、获得屏幕分辨率和要截图的区域坐标。GetDeviceCaps获取屏幕分辨率。
第四、用CreateCompatibleBitmap函数创建与display设备兼容的位图(创建一个与屏幕设备描述表兼容的位图)。
第五、SelectObject函数把新位图选到内存设备描述表中。
第六、BitBlt函数把屏幕设备描述表拷贝到内存设备描述表中。
第七、最后SelectObject得到屏幕位图的句柄。
第八、显示位图。
 
主要代码如下:
HBITMAP C截图Dlg::Copybitmap(LPRECT lprect)
{
    HDC hscrdc, hmemdc;// 屏幕和内存设备描述表
    HBITMAP hbitmap, holdbitmap;// 位图句柄
    int nx, ny, nx2, ny2;// 选定区域坐标
    int nwidth, nheight;// 位图宽度和高度
    int xscrn, yscrn;// 屏幕分辨率
    // 确保选定区域不为空矩形
    if (IsRectEmpty(lprect))
        return NULL;
    //为屏幕创建设备描述表
    hscrdc = CreateDC(L"display", NULL, NULL, NULL);
    //为屏幕设备描述表创建兼容的内存设备描述表
    hmemdc = CreateCompatibleDC(hscrdc);
    // 获得选定区域坐标
    nx = lprect->left;
    ny = lprect->top;
    nx2 = lprect->right;
    ny2 = lprect->bottom;
    // 获得屏幕分辨率
    xscrn = GetDeviceCaps(hscrdc, HORZRES);
    yscrn = GetDeviceCaps(hscrdc, VERTRES);
    //确保选定区域是可见的
    if (nx < 0)
        nx = 0;
    if (ny &lt; 0)
        ny = 0;
    if (nx2 > xscrn)
        nx2 = xscrn;
    if (ny2 &gt; yscrn)
        ny2 = yscrn;
    nwidth = nx2 - nx;
    nheight = ny2 - ny;
    // 创建一个与屏幕设备描述表兼容的位图
    hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);
    // 把新位图选到内存设备描述表中
    holdbitmap = (HBITMAP)SelectObject(hmemdc, hbitmap);
    // 把屏幕设备描述表拷贝到内存设备描述表中
    BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny, SRCCOPY);
    //得到屏幕位图的句柄
    hbitmap = (HBITMAP)SelectObject(hmemdc, holdbitmap);
    //清除
    DeleteDC(hscrdc);
    DeleteDC(hmemdc);
    // 返回位图句柄
    return hbitmap;
}

你可能感兴趣的:(display,分辨率,上下文,设备,的,VC截图)