CDC绘图问题(SelectObject、及绘图无法显示)?

wanglh 2005-06-27 03:01:23
问题1:
根据MSDN的介绍SelectObject选入一个GDI资源,如果之前没有选入同类型的GDI资源,返回的是一个临时的GDI句柄,当前处理的消息结束后该临时GDI句柄的资源会由系统释放。
在我的程序中创建了一个内存DC,该内存DC是成员变量,常驻内存的。当选入第一副图片时,返回的是一个临时GDI句柄,这个句柄不应保存,因为程序结束时该GDI句柄已失效,不应选入。现在的问题是当程序结束时怎样选出原来的GDI。

问题2:
程序绘图时开始都很正常,但后来绘图就不能显示,程序没有出现非法操作,估计可能是某种类型绘图资源消耗过度。绘图中用到的函数有SelectObject,DeleteDC,GetDC,ReleaseDC,DeleteObject等,请大家帮忙找一下原因。
...全文
205 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglh 2005-07-04
  • 打赏
  • 举报
回复
第一个问题,现在的解决方法是内存DC不是永久有效的,只是在一个绘图消息(WM_PAINT)内有效,绘图开始时创建DC,选入位图,绘图完成时选出位图,删除DC,这样还能少占用GDI资源。

第二个问题确实是GDI资源占用太多,经过测试当程序GDI资源占用三百多的时候,程序中自己编写的绘图部分就不能绘图,而普通的控件可以进行绘图。
zPerry 2005-06-28
  • 打赏
  • 举报
回复
DC 中原始的 GDI 对象在 Select 之后需要保存的,至少要保证你自己创建的在销毁时没有正被 Select 在某 DC 中。
一个比较偷懒的方法是在不需要再使用你自己创建的对象时 SelectStockObject(),选入一个同类型的 StockObject,这样可以保证你创建的对象可以被正确的销毁。但有一个例外,就是 Bitmap,似乎没有 Stock 的 bitmap 的,所以我每次都是保存 DC 中原始的 bitmap,等不再使用自己的 bitmap 时 select 回去。

你的第二个问题应该是出现在 98 之类的系统中吧,重画几次之后窗口就变成黑色了。2000,XP 中这个现象可能有时不太明显。建议检查你自己创建的所有 GDI 对象,保证它们析构或者 delete 时没有被选中,可以用我上面讲的方法。
sharper_eel 2005-06-28
  • 打赏
  • 举报
回复
SelectObject 函数的参数是指针
sharper_eel 2005-06-28
  • 打赏
  • 举报
回复
可能是指针错误.
truewill 2005-06-27
  • 打赏
  • 举报
回复
不如用SaveDC和RestoreDC吧
那在结束前删除自己建立GDIObject就好了
goodboyws 2005-06-27
  • 打赏
  • 举报
回复
现在的问题是当程序结束时怎样选出原来的GDI??为什么要选出原来的GDI
wanglh 2005-06-27
  • 打赏
  • 举报
回复
原来的GDI指的是选入第一副图片时,系统会自动生成一个临时的CBitmap指针,这个指针所指向的GDI对象会由系统自动删除,所以保存这个指针是没有意义的。
wanglh 2005-06-27
  • 打赏
  • 举报
回复
当选入第一幅图片时返回的GDI句柄的解释为(见MSDN):
This function may return a pointer to a temporary object. This temporary object is only valid during the processing of one Windows message. For more information, see CGdiObject::FromHandle.
goodboyws 2005-06-27
  • 打赏
  • 举报
回复
1. 原来的GDI指什么??是指你的第一幅图片么,如果那样的话,把它做为成员变量保存就可以了,不需要"选出"
2.有可能就是SelectObject选入的对象没有释放
DentistryDoctor 2005-06-27
  • 打赏
  • 举报
回复
当选入第一副图片时,返回的是一个临时GDI句柄,这个句柄不应保存,因为程序结束时该GDI句柄已失效,不应选入。????


应该是GDI资源资源,2k/XP上如果系统总的GDI对象超进了9999就会出现你说的问题
qrlvls 2005-06-27
  • 打赏
  • 举报
回复
1.选入图片的GDI是不会被释放的,比如LoadBitmap返回的对象可以一直用,不过如果用GetDC得到的句柄在OnPaint结束后就不要用了
wanglh 2005-06-27
  • 打赏
  • 举报
回复
up

15,979

社区成员

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

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