关于C++ 截取屏幕代码中的一段函数 谁能帮我逐句解释下 特别是这里用到两个HDC 和两个HBITMAP 10
HBITMAPCopyScreenToBitmap(){HDChScrDC,hMemDC;HBITMAPhBitmap,hOldBitmap;intnWidth,nHei...
HBITMAP CopyScreenToBitmap()
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nWidth, nHeight;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC); //为屏幕设备描述表创建兼容的内存设备描述表
nWidth = GetSystemMetrics(SM_CXSCREEN);
nHeight = GetSystemMetrics(SM_CYSCREEN);
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return hBitmap;
} 展开
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nWidth, nHeight;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC); //为屏幕设备描述表创建兼容的内存设备描述表
nWidth = GetSystemMetrics(SM_CXSCREEN);
nHeight = GetSystemMetrics(SM_CYSCREEN);
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return hBitmap;
} 展开
1个回答
展开全部
HBITMAP CopyScreenToBitmap()
{
HDC hScrDC, hMemDC; // 声明2个设备上下文句柄
HBITMAP hBitmap, hOldBitmap; // 声明2个位图句柄
int nWidth, nHeight; // 声明2个变量,用于后面存储平面的宽度和高度
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); // 取得屏幕DC,并赋值给hScrDC
hMemDC = CreateCompatibleDC(hScrDC);// 为屏幕设备描述表创建兼容的内存设备描述表
nWidth = GetSystemMetrics(SM_CXSCREEN);// 得到被定义的系统数据的宽度
nHeight = GetSystemMetrics(SM_CYSCREEN);// 得到被定义的系统数据的高度
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);// 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY); // 将屏幕DC直接拷贝到内存DC
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);// 用老位图替换当前内存DC
DeleteDC(hScrDC); // 释放DC
DeleteDC(hMemDC); // 释放DC
return hBitmap; // 返回位图
}
{
HDC hScrDC, hMemDC; // 声明2个设备上下文句柄
HBITMAP hBitmap, hOldBitmap; // 声明2个位图句柄
int nWidth, nHeight; // 声明2个变量,用于后面存储平面的宽度和高度
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); // 取得屏幕DC,并赋值给hScrDC
hMemDC = CreateCompatibleDC(hScrDC);// 为屏幕设备描述表创建兼容的内存设备描述表
nWidth = GetSystemMetrics(SM_CXSCREEN);// 得到被定义的系统数据的宽度
nHeight = GetSystemMetrics(SM_CYSCREEN);// 得到被定义的系统数据的高度
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);// 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY); // 将屏幕DC直接拷贝到内存DC
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);// 用老位图替换当前内存DC
DeleteDC(hScrDC); // 释放DC
DeleteDC(hMemDC); // 释放DC
return hBitmap; // 返回位图
}
追问
hMemDC = CreateCompatibleDC(hScrDC);// 为什么内存DC要通过屏幕DC来得到?
hOldBitmap 算是内存中的位图?
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY);
拷贝到内存DC中做什么?
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);// 用老位图替换当前内存DC
为什么要替换?
这两句请再解释清楚一些 看不大懂
追答
1. CreateCompatibleDC创建兼容的内存DC,所谓兼容就是指创建与屏幕DC相同的东西,这样才好放置截取屏幕得来的位图,不然岂不是放不下,或者空间太多了浪费,或者格式不对~
2、hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap) 是将使用CreateCompatibleDC得到的内存DC hMemDC中的当前活动的对象设置为hBitmap,并且返回先前的活动对象,用hOldBitmap 保存下来
3、当前活动的是hBitmap了,那么BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, 0, 0, SRCCOPY);就将截取到的屏幕位图拷贝到hBitmap,
4、好了屏幕位图已经被拷贝到hBitmap了,那么当然还要还原以前屏幕的位图咯,就又使用hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap),将原先保存下来的hOldBitmap 还原回去
5、最后肯定要释放内存咯
6、然后返回所得位图
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询