正在阅读:Windows Gdi 应用-入门篇 (VC SDK)Windows Gdi 应用-入门篇 (VC SDK)

2005-06-14 10:18 出处: 作者:i_like_cpp 责任编辑:moningfeng
上面的函数我们可以多次看到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绘图技巧的学习:通过阅读、运行、调试别人源代码获得经验这条路径是最快的。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品