关于SelectObject、DeleteObject和DeleteDC的问题

lailzhihou 2008-08-19 01:47:57
1、为什么SelectObject要成对的出现?比如:
bitmap = CreateCompatibleBitmap(...);
HBITMAP oldbitmap = SelectObject(hdc, bitmap);
...
SelectObject(hdc, oldbitmap);
这里为什么要后面一句,如果不用有什么后果?
2、对于上面的bitmap使用DeleteObject来删除内存空间的时候,如果在SelectObject(hdc, oldbitmap);之前删除是失败的,而要在SelectObject(hdc, oldbitmap);之后删除才能成功,才意味着释放了bitmap的内存?这是为什么?
3、DeleteDC到底在删除什么东西?比如DeleteDC(hdc);这里的hdc是一个句柄吧,删除它有什么作用呢?还有如果有HBITMAP oldbitmap = SelectObject(hdc, bitmap);
DeleteDC(hdc);
这样删除hdc的时候,同时删除了bitmap的内存空间吗?
...全文
1006 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lailzhihou 2008-08-21
  • 打赏
  • 举报
回复
感谢大家的帮助,现在基本了解了
wbcp2000 2008-08-20
  • 打赏
  • 举报
回复
1、为什么SelectObject要成对的出现?比如:
bitmap = CreateCompatibleBitmap(...);
HBITMAP oldbitmap = SelectObject(hdc, bitmap);
...
SelectObject(hdc, oldbitmap);
这里为什么要后面一句,如果不用有什么后果?

----------------
不用会丢内存;其实也就是oldbitmap丢失了,以后无法释放了。
2、对于上面的bitmap使用DeleteObject来删除内存空间的时候,如果在SelectObject(hdc, oldbitmap);之前删除是失败的,而要在SelectObject(hdc, oldbitmap);之后删除才能成功,才意味着释放了bitmap的内存?这是为什么?

---------------
因为此时bitmap在使用中。


3、DeleteDC到底在删除什么东西?比如DeleteDC(hdc);这里的hdc是一个句柄吧,删除它有什么作用呢?还有如果有HBITMAP oldbitmap = SelectObject(hdc, bitmap);
DeleteDC(hdc);
这样删除hdc的时候,同时删除了bitmap的内存空间吗?

--------------------------------------
NO, DeleteDC和GetDC 配对使用。

总结:以上问题,属于GDI编程最常见问题,初学者一定要弄明白,可以自己做几个实验。如果弄不明白,很容易丢内存。
Reallyu 2008-08-20
  • 打赏
  • 举报
回复
1.因为被选入dc的bitmap是无法删除的,所以最后调用SelectObject(hdc, oldbitmap); 选入oldbitmap,这样才可以用DeleteObject删除之前的bitmap释放空间,而oldbitmap是系统保有的不需要删除.
3.系统也是要为dc分配一些资源的,DeleteDC就是删除这些资源,直接删除dc应该不会删除bitmap空间,必须显式的调用DeleteObject.
lailzhihou 2008-08-20
  • 打赏
  • 举报
回复
UP
Amuro1987218 2008-08-20
  • 打赏
  • 举报
回复
有借有还,再借不难,借了不还单方面删除这笔帐单,不会被允许
jameshooo 2008-08-20
  • 打赏
  • 举报
回复
如果别人借你一个东西,你最好保持原样归还,不要损坏。DC也一样,给你用了DC,你可以随意选入你需要的GDI对象来完成特定的绘制效果,但是放弃使用该DC时请确保完全恢复原状。
lenux 2008-08-20
  • 打赏
  • 举报
回复
找本gdi的书看,就明白了。

19,468

社区成员

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

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