有关DeleteObject()函数

LICHUNLI1022 2011-04-06 03:18:00
有关DeleteObject()函数会看到这样一句话:
如果CGdiObject对象正被选入设备上下文中,则应用不可对此对象调用DeleteObject。当一个模式画刷被删除时,与之相关联的位图不被删除。位图必须被独立删除。

不幸的是碰巧遇到这样的情况,

CBitmap bmDents;
m_bmDents.LoadBitmap(IDB_BITMAP_BKG);

CDC m_memDC;
m_memDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap=m_memDC.SelectObject(&m_bmDents);

m_memDC.DeleteDC();
pOldBitmap->DeleteObject();
DeleteObject(m_bmDents);

在代码的结尾我只是删除了m_bmDents,位图并没有被被独立删除。这样在下一次m_memDC.SelectObject(&m_bmDents); 能够正常选入,却不是原来的背景图。


想问的就是:
如果CGdiObject对象正被选入设备上下文中,则应用不可对此对象调用DeleteObject。当一个模式画刷被删除时,与之相关联的位图不被删除。位图必须被独立删除。

位图如何被独立删除????




...全文
432 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LICHUNLI1022 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]

CBitmap bmDents;
因为你在这里定义的是局部变量,出了作用域,调用该类的析构函数,它的析构函数中最DeleteObject会释放相关联的GDI资源
[/Quote]
哦,
Eleven 2011-04-06
  • 打赏
  • 举报
回复
CBitmap bmDents;
因为你在这里定义的是局部变量,出了作用域,调用该类的析构函数,它的析构函数中最DeleteObject会释放相关联的GDI资源
LICHUNLI1022 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xjy1204 的回复:]

另外就是注意一下
CBitmap 这样的类在析构时候会自动DeleteObject
使用它作为局部变量的时候注意一下
[/Quote]
不太明白。。。。
LICHUNLI1022 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xjy1204 的回复:]

独立删除其实指的就是
你创建了一个位图
你在DC里使用时不可把这个位图DeleteObject
用完之后DeleteDC并不会帮你把这个位图Delete
正常做法是
SelectObject(oldObject)
之后把你这个位图删除

也就是说你上面代码的
pOldBitmap->DeleteObject(); // 改成m_memDC.SelectObject(pOldBi……
[/Quote]
m_memDC.SelectObject(pOldBitmap)的作用是什么呢?
NightTravelDeity 2011-04-06
  • 打赏
  • 举报
回复
m_memDC.SelectObject(pOldBitmap);
m_memDC.DeleteDC();
m_bmDents->DeleteObject();



无水先生 2011-04-06
  • 打赏
  • 举报
回复
应该在退出前调用: selectobject(oldObject),之类的,将指针复原
至于位图定义:CBitmap m_bmp;不需要人工删除
xjy1204 2011-04-06
  • 打赏
  • 举报
回复
另外就是注意一下
CBitmap 这样的类在析构时候会自动DeleteObject
使用它作为局部变量的时候注意一下
xjy1204 2011-04-06
  • 打赏
  • 举报
回复
独立删除其实指的就是
你创建了一个位图
你在DC里使用时不可把这个位图DeleteObject
用完之后DeleteDC并不会帮你把这个位图Delete
正常做法是
SelectObject(oldObject)
之后把你这个位图删除

也就是说你上面代码的
pOldBitmap->DeleteObject(); // 改成m_memDC.SelectObject(pOldBitmap)

你上面的代码是不全还是随手写的示例代码? 有些不清楚
不过大概意思就是这样, 感觉lz对独立删除的理解好像有误会
HowToP2p 2011-04-06
  • 打赏
  • 举报
回复
他说的Patternbrush是 用 CreatePatternBrush创建的画刷吧?

位图独立删除就是DeleteObject,CBitmap对象析构也就删除了
生产者消费者 1.线程创建函数:用户界面线程和工作者线程都是由AfxBeginThread创建的 CWinThread* AFXAPI AfxBeginThread(    CRuntimeClass* pThreadClass,    int nPriority,    UINT nStackSize,    DWORD dwCreateFlags,    LPSECURITY_ATTRIBUTES lpSecurityAttrs) 其中: 参数1是从CWinThread派生的RUNTIME_CLASS类; 参数2指定线程优先级,如果为0,则与创建该线程的线程相同; 参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同; 参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。 参数5表示线程的安全属性,NT下有用。 2.删除信号量DeleteObject函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了 函数原型:BOOL DeleteObject(HGDIOBJ hObject); 参数: hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。 返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。 3.创建信号量:创建一个新的信号量 CreateSemaphore()函数 HANDLE CreateSemaphore(  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全属性指针  LONG lInitialCount, // 初始计数  LONG lMaximumCount, // 最大计数  LPCTSTR lpName // 对象名指针

15,979

社区成员

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

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