第一、首先用CreateDC函數建設備上下文環(huán)境(創(chuàng )建設備描述表),名為display。
第二、用CreateCompatibleDC函數創(chuàng )建display設備兼容的內存設備上下文環(huán)境(DC)(創(chuàng )建兼容的內存設備描述表)。
第三、獲得屏幕分辨率和要截圖的區域坐標。GetDeviceCaps獲取屏幕分辨率。
第四、用CreateCompatibleBitmap函數創(chuàng )建與display設備兼容的位圖(創(chuàng )建一個(gè)與屏幕設備描述表兼容的位圖)。
第五、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;
//為屏幕創(chuàng )建設備描述表
hscrdc = CreateDC(L'display', NULL, NULL, NULL);
//為屏幕設備描述表創(chuàng )建兼容的內存設備描述表
hmemdc = CreateCompatibleDC(hscrdc);
// 獲得選定區域坐標
nx = lprect->left;
ny = lprect->top;
nx2 = lprect->right;
ny2 = lprect->bottom;
// 獲得屏幕分辨率
xscrn = GetDeviceCaps(hscrdc, HORZRES);
yscrn = GetDeviceCaps(hscrdc, VERTRES);
//確保選定區域是可見(jiàn)的
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;
// 創(chuàng )建一個(gè)與屏幕設備描述表兼容的位圖
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;
}