第一、首先用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 < 0)
ny = 0;
if (nx2 > xscrn)
nx2 = xscrn;
if (ny2 > 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;
}