CreateCompatibleDC,CreateCompatibleBitmap,SelectObject详解
物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存空间.
这样有很多好处,以来我们可以在加载图片后,在图片上利用DC的各种绘图功能.请看如下示例:
兼容DC在建立之初,只有1*1像素的尺寸,SelectObject选择bitmap以后才可以进行绘图.
内存DC的可见区域是简单的区域,不像物理DC可见区域可能被其他窗口覆盖而产生复杂的可见区域.由于DC的任何绘图都需要考虑在可见区域内绘图,绝对不能超出可见区域的范围.因此每个GDI绘图输出最终都需要和构成复杂可见区域的每一个巨型区域进行剪裁输出,因此物理DC的绘图效果会比兼容DC速度慢一些.这也就是我们经常用兼容DC进行双缓存输出的一个原因
HDC hdc=GetDC(hwnd);
HDC memdc=CreateCompatibleDC(hdc);
RECT rc;
BITMAP bmp;
HBITMAP holdbmp,hbmp=LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_CLOCK));//从资源加载位图
holdbmp=(HBITMAP)SelectObject(memdc,hbmp);//这里把hbmp的位图选择到兼容DC memdc,之后这个兼容DC就拥有和
//hbmp同样大小的绘图区域,注意超出位图返回的GDI输出都是无效的.
GetObject(hbmp,sizeof(BITMAP),&bmp);//这里获取位图的大小信息,事实上也是兼容DC绘图输出的范围
SetRect(&rc,0,0,bmp.bmWidth,bmp.bmHeight);
DrawText(memdc,"Center Line Text" -1,&rc,DT_VCENTER|DT_SINGLELINE|DT_CENTER);//在兼容DC中间位置输出字符串
//这样以来我们就相当于把hbmp这个位图加上了文字标注,我们可以把这个增加了文字标注的位图保存起来.一个简单的图像处理基本就OK了.
SelectObject(memdc,holdbmp);//复原兼容DC数据.
DeleteDC(memdc);
//..........
我的理解:
CreateDC创建的是物理层的设备描述表。
兼容DC,也就是用HANDLE memdc = CreateCompatibleDC所创建的,它并有资源或者说是存储空间,所以就把BITMAP扯了进来,你在memdc区域绘图的时候,需要一个位图结构来存储这些数据。就是用SelectObject将hBitmap选入到memdc连联起来,将hBitmap作来memdc的存储空间。
下面的例子获得屏幕位图的例子:
HBITMAP CGetScreenView::GetScreenBitmap(RECT* rect)
{
HDC hScrDC, hMemDC;//屏幕设备描述表和内存设备描述表
HBITMAP hBitmap, hOldBitmap;//hBitmap位图句柄用来保存rect所对应的图片
hScrDC = ::GetDC(NULL);//创建屏幕设备描述表
hMemDC = CreateCompatibleDC(NULL);//创建内存设备描述表
int nWidth = GetDeviceCaps(hScrDC, HORZRES);
int nHeight = GetDeviceCaps(hScrDC, VERTRES);
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);//创建一个与屏幕设备描述表兼容的位图
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);//把位图选进内存设备描述表
StretchBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, 0, 0, nWidth, nHeight, SRCCOPY);//将屏幕设备描述表的内容拷贝到内存设备描述表中,也就是将屏幕设备表的内容拷贝到了hBitmap中。也就把屏幕位图保存了下来。
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);//把图片放到hBitmap中
::ReleaseDC(NULL, hScrDC);
DeleteDC(hMemDC);
return hBitmap;
}
这个流程之前不被理解的原因在于,HBITMAP不能从直接从屏幕设备描述表那里获得数据,它需要经过内存DC来将屏幕设备描述表中的数据读出来,并拷贝到HBITMAP中。
CreateCompatibleDC,CreateCompatibleBitmap,SelectObject详解相关推荐
- CreateCompatibleDC CreateCompatibleBitmap SelectObject详解
物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存 ...
- CreateCompatibleDC CreateCompatibleBitmap SelectObject
CreateCompatibleDC:在内存中创建一个兼容DC CreateCompatibleBitmap:创建一幅与兼容DC关联的位图 SelectObject:将位图选入兼容DC中 BitBlt ...
- Windows API函数大全---附:windows运行命令详解
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连 ...
- 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度 ...
- MFC实现图像灰度、采样和量化功能详解
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度 ...
- VC++深入详解学习笔记
VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesso ...
- BitBlt C++中BitBlt如何使用详解
想了解C++中BitBlt怎样使用详解的相关内容吗,z0203153008在本文为您仔细讲解BitBlt的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C++中BitBlt的使用,C++中 ...
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移.图形 ...
- 酒店点餐系统开发详解(六)
酒店点餐系统开发详解(六) --疑难解决 在本系统的详细设计过程中遇到了很多的麻烦,经过分析.思考和网上搜索等方式将所有问题均给一一化解了,现与大家分享以共勉. 1.CDataGrid的使用 之所以使 ...
最新文章
- 模型融合方法最全总结!
- python游戏最简单代码-用python写游戏脚本原来这么简单
- 移植Python2到TQ2440
- c语言课程设计大作业模版,c语言课程设计报告模板下载
- AIDE --Linux高级入侵检测
- mysql查询当前用户下的表空间_oracle 如何查看当前用户的表空间名称
- 查询网站web服务器,web服务器地址查询
- asp.net core文档下载_推荐一个必备的开源项目 (附下载链接)
- mock SpringMVC 测试控制器方法
- [USACO14OPEN]Odometer【数位DP】
- 为Mac任意命令设置快捷键
- [多图]Maclean的巴厘岛游记
- 【渗透测试】Sunlogin-RCE(向日葵)
- html实现文字在表格上方左侧,html,表格,左对齐.doc
- Javascript MS题蓄力:
- LeetCode-179-最大数
- linux at 邮箱,linux at 命令详解
- 小学生都能看懂,彻底解决环境搭建难题,一步一截图,再无VMware网络难题
- 使用FileOutPutStream下载docx文件报文件已损坏解决
- vb.net mysql 查询,mysql-vb.net查询以显示数据表的特定行[基本]