19,468
社区成员
发帖
与我相关
我的任务
分享
/*************************************************************************
*
* \函数名称:
* CopyScreenToDIB
*
* \输入参数:
* LPRECT lpRect - 需要拷贝的屏幕区域
* CDib* pDibDest - 指向目标CDib对象的指针
*
* \返回值:
* BOOL - 如果操作成功,则返回TRUE
*
* \说明:
* 该函数将指定矩形位置内的屏幕内容拷贝到DIB中源CDib类pDibSrc中的数据拷贝到pDibDst中
*
*************************************************************************
*/
BOOL CopyScreenToDIB(LPRECT lpRect, CDib* pDibDest)
{
// 屏幕设备上下文和内存设备上下文句柄
HDC hScrDC, hMemDC;
// 声明BITMAP临时句柄和以前的BITMAP句柄
HBITMAP hBitmap, hOldBitmap;
// 调色板句柄
HPALETTE hPalette;
// 获取矩形区域的坐标
int nX, nY, nX2, nY2;
// DIB图象的高度和宽度
int nWidth, nHeight;
// 屏幕分辨率
int xScrn, yScrn;
// 如果给定的矩形区域为空,则不进行进一步的处理
if (IsRectEmpty(lpRect)) return FALSE;
// 得到一个屏幕设备上下文
hScrDC = CreateDC("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;
// 计算DIB图象的高度和宽度
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备上下文兼容的DDB位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 将DDB位图选入内存设备上下文
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 将屏幕中指定区域的图象传输到内存设备上下文中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
// 然后将以前的图象选入,并得到屏幕区域的DDB图象句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
// 将临时的设备上下文删除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 得到当前系统调色板
hPalette = GetSystemPalette();
// 将DDB图象转换为DIB图象
pDibDest->ConvertFromDDB(hBitmap,hPalette);
// 删除临时对象
DeleteObject(hPalette);
DeleteObject(hBitmap);
return TRUE;
}