上面的函数我们可以多次看到SelectObject的调用,这就是前面所说的绘图函数基本上都是有状态的。这个状态保存在HDC中,而SelectObject则设置HDC的状态。通常称为选入。至于注释中的恢复是怎么回事呢?这要从CPen CBrush CFont等等说起了,它们是对GDI对象的封装。GDI对象通过CreatePen CreateBrush CreateFont等等函数创建,返回一个HGDIOBJ。这些对象不使用的时候需要销毁,用DeleteObject函数,但是如果一个HGDIOBJ被选入到一个HDC中的时候,它就不能被销毁,这样就造成了GDI资源的泄漏。解决这一问题通常有两种做法: 第一种,就是上面代码中看到的: 先保存原来的HGDIOBJ,def_font = cDC.SelectObject(pfont); 用完了之后再恢复原来的 cDC.SelectObject(def_font); 这样做,就保证了pfont能被正确销毁,至于原来的def_font能不能被销毁,就不关我们的事了。 第二种,利用了系统的库存对象。库存GDI对象是windows系统预先创建的,不需要应用程序销毁。所以,不需要保存原来的HGDIOBJ,直接像这样 SelectObject (hdc, ::GetStockObject (NULL_BRUSH)); 或者cDC.SelectStockObject(NULL_BRUSH); 就可以保证HDC中没有被选入任何我们自己创建的画刷了。 这两种方法各有好处,视情况选用。 另外上面说大部分GDI函数都是有状态的,有一个例外就是FillRect函数,它靠一个传给他的画刷进行填充。 三、 技巧 实例讲述完毕,接下来有一些补充技巧: 1. GDI绘图技巧的学习:通过阅读、运行、调试别人源代码获得经验这条路径是最快的。 |
正在阅读:Windows Gdi 应用-入门篇 (VC SDK)Windows Gdi 应用-入门篇 (VC SDK)
2005-06-14 10:18
出处:
责任编辑:moningfeng
键盘也能翻页,试试“← →”键