作者xxtomnyxx (翼天)
看板Programming
标题[问题] 使用 GDI 时的 DC 和 Object 问题
时间Thu Jan 2 14:49:05 2014
呃......小弟我程式语言是自学的,
如果这个问题不适合发在这里就请坂主砍了吧。
使用 GDI 进行绘图及视窗输出时,
要先创建出一个 Object,
然後创建一个 DC 後用 SelectObject 把 Object 选入 DC 中,
但是我发现把 Object Select 到 DC 之後,
就算把 Object 用 DeleteObject 删除掉,
DC 还是能正常的使用。
就是说如果我用 CreateDIBSection 创建出一个 Object,
然後在这个 Section 中填入颜色,
再用 CreateCompatibleDC 创建出一个 DC 後,
用 SelectObject 把上述 Object 选取到 DC 上,
然後就把该 Object 用 DeleteObject 删除掉,
但是被选取的 DC 却还是能用 BitBlt 或其它绘图 API
把我填入的颜色画到其它 DC 上。
基於效能需求,
我必须把大量图片在一开始就读入记忆体,
我记得 Object 和 DC 的数量是有限制的,
所以我应该把读入记忆体的图档用 Object 储存呢?
还是把这个 Object 选取到 DC 後就把 Object 删除,
用 DC 来储存呢?
如果用 Object 来储存,
每次我要使用图档时就要把这个 Object 选取到 DC 上,
我是要每次需要时就创建一个 DC 然後用完就把 DC 删除掉,
还是要创建一个 DC 後固定用这个 DC 当媒介?
如果要固定一个 DC 当媒介,
那我要怎麽确定这个 DC 中包含有的 Object 是哪个以避免重复选取呢?
感谢各位的指教!
--------------------------我自己找到答案了----------------------------
DC 也是 Object 的一种,
CreateCompatibleDC 时不是只有创建一个 DC,
同时也已经替这个 DC 指定了一个 Object,
只是这个 Object 是一个只有 1 画素的 Bitmap,
如果要使用固定一个 DC 当媒介,
在使用完後可以用这个 1 画素的 Object 去把新物件取代掉。
在创建一个 DIBSection 之後,
一旦把这个 DIBSection 的 Object 选取到 DC 之後,
原本属於 DIBSection 的记忆体就会被关联到 DC 上,
只是单纯 Delect 掉 DIBSection 的 Object 或关连的 DC 的其中一项的话,
记忆体是不会被释放的,
只有 DIBSection 的 Object 与关连的 DC 两个都被删除时,
记忆体区块才会被释放。
这样看来,
在创建一个 DIBSection 的 Object 之後,
一旦把这个 Object 关联到一个 DC,
就可以把 Object 删除以减少占用的 Object 数量,
绘图时直接调用 DC 来绘图就可以了。
有错的话还请各位指教。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 180.204.86.202
※ 编辑: xxtomnyxx 来自: 180.204.86.202 (01/02 16:45)
2F:→ purpose:大量图读进记忆体,这样不就好了。 124.8.128.222 01/02 16:54
3F:→ xxtomnyxx:因为我的图片有各种格式啊,不是单纯的 180.204.86.202 01/02 17:05
4F:→ xxtomnyxx:Bitmap 180.204.86.202 01/02 17:05