DeleteDC的使用时机和易犯错误.docxVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DeleteDC的使用时机和易犯错误

DeleteDC的使用条件SUNNY.man一直以来,针对DC的操作自已都认为使用的很熟练,不会出什么问题。应该释放的都释放,应该删除的都删除。GetDC都ReleaseDC了。CreateDC也都使用了DeleteDC了,一定不会有什么问题。比如创建一个内存DC用如下的代码:Void InitMemDC(CDC *pDC){DestroymemDC();if(pDC){if(m_memDC.CreateCompatibleDC(pDC)){if(m_memBmp.LoadBitmap(lIDBMP)){m_pBitmapOld=m_memDC.SelectObject(m_memBmp);m_bCreateDC=TRUE;}}}//if pDC}Void DestroymemDC(){if(m_bCreateDC){if(m_memBmp.m_hObject) m_memBmp.DeleteObject(); if(m_memDC.m_hDC)m_memDC.DeleteDC();m_pBitmapOld=NULL;m_bCreateDC=FALSE;}}这种代码,在XP下,我一直用的好好的从没出现过任何问题,最近移植到WINCE6.0时下,在测试时我发现当连续使用35次时,系统死机。原因是什么呢,我百思不得其解。于是一点点的做代码增减试验,最终我确定就在上述两个函数之内。InitMemDC肯定没有什么问题因为我实在找不出错误的原因,那就说明错误发生在第二个函数内。可是就是一个释放DC的过程会有什么问题呢。我拿出MSDN。找到下面一句话An application must not delete a device context whose handle was obtained by calling CWnd::GetDC. Instead, it must call CWnd::ReleaseDC to free the device context. The CClientDC and CWindowDC classes are provided to wrap this functionality. The DeleteDC function is generally used to delete device contexts created with CreateDC, CreateIC, or CreateCompatibleDC.看完之后我更纳闷了,我的使用上没有什么问题啊。这样我又想其它的解决办法折腾了一上午,问题还是没有解决。只好再看MSDN,最终真理再一次被证明,“所有的错误都是因为你没有好好看MSDN”。我下面这句话:An application should not call DeleteDC if objects have been selected into the device context. Objects must first be selected out of the device context before it is deleted. 难道仅仅是因为我没有把原先的Cbitmap选出来吗,我立马在DestroyDC首句加上了M_memDC.SelectObject(m_pOldbmp);就像热水泼在雪上,所有的奇怪错误都消失了。一切都运行正常了。我自已猜想了了下,一定是在DeleteDC时,MS进行了Objects的保存或是复制操作,总之会做一些内容。这样就留下了一些痕迹,也就占用了一些系统内核空间。所以才出现没释放的错误。XP下一定也会出错误,只不过是因为空间比较大,没有达到上限而已,这个试验我没有做。 As_mhy@163.com

文档评论(0)

xy88118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档