第一、首先用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; } |
|
来自: 阿钢avckkrh3m1 > 《编程》