关于GDI对象,SelectObject()的提问,求指教一段代码

LRYIVAN 2011-01-22 03:09:07
1. HBITMAP m_hBitmap = CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);
2. HBITMAP m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
3. BitBlt(m_hMemDC, 0, 0, pt.x, pt.y, m_hScrDC, 0, 0, SRCCOPY);

第一行中,m_hBitmap已经获得设备m_hScrDC上绘制的位图了吗?

第二行中,m_holdBitmap得到什么内容

或者说这一段代码里什么时候m_hBitmap获得m_hScrDC的内容?

对这一类型的代码特别容易晕,求高手指教,并希望告知从哪里能把原理搞懂,不胜感谢
...全文
546 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
LRYIVAN 2011-03-08
  • 打赏
  • 举报
回复
嗯,谢谢大家的帮助!最近看了孙鑫的视频,觉得长知识了不少!
HBITMAP m_hBitmap = CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);
这一句中 m_hBitmap只有位图信息头的内容,还没有颜色表和位图数据等东西,所以需要后面两句将这些东西粘上去
erben 2011-02-17
  • 打赏
  • 举报
回复
楼主你看下面这一段好理解吗?
static HPEN blackPen = CreatePen(PS_SOLID,1,RGB(0,0,0));
pDC->SelectObject(blackPen);
pDC->Rectangle(&rec);

类似地理解一下试试,觉得可以理解
HuWenjin 2011-01-25
  • 打赏
  • 举报
回复
好像
3) BitBlt(m_hMemDC, 0, 0, pt.x, pt.y, m_hScrDC, 0, 0, SRCCOPY);

是把源DC复制了?

直接取原DC中的内容到新建的内存DC中去了


这不是防闪绘制吧,是截屏用的。
辰岡墨竹 2011-01-25
  • 打赏
  • 举报
回复
不,SelectObject的意义在于让MemDC中的位图格式正确,创建的内存DC默认有一个单色的1x1的位图,SelectObject就是用那个彩色位图去替换必须让源DC和目标DC的位图格式和所需尺寸一致BitBlt拷贝才能正确。m_hOldBitmap得到的就是原来那个1x1的单色位图,不过一般来说它留着没什么用,不写它也没关系,直接SelectObject就可以了。
ga6840 2011-01-25
  • 打赏
  • 举报
回复
首先 m_hSrcDC 的 Src 代表的应该是 source (源)的缩写 不是屏幕的意思
在编程的一些习惯命名里面 Src 是很常见的缩写,它对应的很常见的缩写是 Dest(destination)

BitBlt 简单地说就是 把源图像 拷贝到 目的图像(可能是某一区域)上 没说要目的图像是空啊!!
请你看msdn
强烈建议你写写实验一下
wangbo56916860 2011-01-25
  • 打赏
  • 举报
回复
选中的位图不一定是空白的位图。
图像拷贝,应该相当于截图
LRYIVAN 2011-01-25
  • 打赏
  • 举报
回复
谢谢各位的帮助,那么我是不是可以这样理解呢:

对于设备上下文DC,如果要将屏幕DC(m_hSrcDC)上选中的位图拷贝到内存DC(m_hMemDC)上,那么m_hMemDC必须要先选中一副空白的位图,然后通过BitBlt将m_hSrcDC选中的位图拷贝到内存位图上

这个时侯m_hMemDC事先选中的空白位图就已经获得了屏幕DC所选中的位图的内容是吗?

其实这是相当于截图吗?

我要做一下小程序试验一下。特别感谢一下5楼,你真的很有耐心,太感谢了
wangbo56916860 2011-01-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 lryivan 的回复:]
1. HBITMAP m_hBitmap = CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);
2. HBITMAP m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
3. BitBlt(m_hMemDC, 0, 0, pt.x, pt.y, m_hScrDC, 0, 0, S……
[/Quote]
1.根据m_hSrcDC设备创建关联得HBITMAP,但是并不关联到任何DC设备
2.SelectObject选入目标DC设备当中,同时用oldbitmap保存DC设备当中被替换出来得HBITMAP,以供使用结束后,释放m_hbitmap资源.
3.m_hMemDC是创建得内存DC,实现二次缓冲,防止闪屏。
ga6840 2011-01-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ga6840 的回复:]
现在 BitBlt 的目的参数 不就是要填写一个DC 类型的吗?你把这只 已经选择了位图的dc 传给 BitBlt 的第一个参数 ,BitBlt 负责把m_hScrDC选中的位图 复制到了 你hDCMem选中的东西上

你hDCMem选中的东西又是什么呢?是选中了m_hBitmap这个句柄 ,而这个句柄不就是你第一句 CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);开辟的位图空间 返回的句柄 ,结果就是将m_hScrDC 句柄指代的位图 复制到了这个新的空间里。

[/Quote]

不好意 ,这两个名字好像 囧 ....
你把我引用的这段文字的 hDCMem 替换成 m_hMemDC 就行了
ga6840 2011-01-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ga6840 的回复:]

如果没有::SelectObject(hDCMem, hOldMap); 那么m_hMemDC是什么?
m_hMemDC这个设备描述表 此时应该并没有 填上任何信息 又Blt到哪里呢?
[/Quote]
嗯 我复制的应该是你的第二句SelectObject(m_hMemDC, m_hBitmap); 变量名字写错 意思是一样的
我的意思是说 如果没有::SelectObject(m_hMemDC, m_hBitmap); 那么m_hMemDC并没有 选中东西
你 m_hMemDC->SelectObject 不就可以理解为 用 m_hMemDC 去选择 m_hBitmap 。
m_hMemDC 这个句柄可以理解成一只手 ,Select 了一个位图的句柄m_hBitmap , 你这只手获得了这个句柄所指位图的信息描述

现在 BitBlt 的目的参数 不就是要填写一个DC 类型的吗?你把这只 已经选择了位图的dc 传给 BitBlt 的第一个参数 ,BitBlt 负责把m_hScrDC选中的位图 复制到了 你hDCMem选中的东西上

你hDCMem选中的东西又是什么呢?是选中了m_hBitmap这个句柄 ,而这个句柄不就是你第一句 CreateCompatibleBitmap(m_hScrDC, pt.x, pt.y);开辟的位图空间 返回的句柄 ,结果就是将m_hScrDC 句柄指代的位图 复制到了这个新的空间里。

所以如果你没有第二句,m_hMemDC并没有选中什么

至于 CreateCompatibleBitmap 第一个参数你填的m_hScrDC 又有什么用,MSDN 告诉你 ,他是用来让CreateCompatibleBitmap 函数产生 一个与m_hScrDC所指位图相兼容的 位图,并返回它的句柄
在你的第一句里 这个句柄就是 m_hBitmap

LRYIVAN 2011-01-23
  • 打赏
  • 举报
回复
对楼上的解释还是不太明白,不过还是很感谢,能够再解释得详细一点吗?
我知道的是像屏幕DC,是用GetDC()获得屏幕的设备上下文的,像m_hMemDC这种内存设备,不是有m_hMemDC.CreateCompatibleDC(m_hSrcDC),就相当于生成了一个内存设备了吗?
我对这方面很混乱,希望能够比较系统地了解一下
另外::SelectObject(hDCMem, hOldMap); 是二楼提供的链接中的帖子中的,m_hMemDC是我的帖子里的,他们没关系,但是我对那个帖子的问题也不太了解。
ga6840 2011-01-23
  • 打赏
  • 举报
回复
如果没有::SelectObject(hDCMem, hOldMap); 那么m_hMemDC是什么?
m_hMemDC这个设备描述表 此时应该并没有 填上任何信息 又Blt到哪里呢?
LRYIVAN 2011-01-22
  • 打赏
  • 举报
回复
我和楼上提到的那位楼主一样,很好奇为什么::SelectObject(hDCMem, hOldMap);
注释掉后不能够显示图片,那个问题的帖子还是不能解决我的疑问
hztj2005 2011-01-22
  • 打赏
  • 举报
回复
前段时间刚有人问过:

http://topic.csdn.net/u/20110110/22/671136ec-ba2b-4763-ba3d-be52968bf700.html

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧