GDI对象的选择与释放

GDI对象通过SelectObject来选择。GDI对象主要有以下几类。

GDI对象

产生方法

销毁方法

位图(HBITMAP)

CreateBitmap,CreateBitmapIndirect,

CreateCompatibleBitmap,CreateDIBitmap,

CreateDIBSection,CreateDiscardableBitmap

DeleteObject

画刷(HBRUSH)

CreateBrushIndirect,CreateDIBPatternBrush,

CreateDIBPatternBrushPt,CreateHatchBrush,

CreatePatternBrush,CreateSolidBrush

DeleteObject

设备上下文(HDC)

CreateDC

DeleteDC,ReleaseDC

字体(HFONT)

CreateFont,CreateFontIndirect

DeleteObject

内存DC(HDC)

CreateCompatibleDC

DeleteDC

调色板(HPALETTE)

CreatePalette

DeleteObject

画笔(HPEN)

CreatePen,CreatePenIndirect

DeleteObject

区域(HRGN)

CombineRgn,CreateEllipticRgn,

CreateEllipticRgnIndirect,CreatePolygonRgn,

CreatePolyPolygonRgn,CreateRectRgn,

CreateRectRgnIndirect,CreateRoundRectRgn,

DeleteObject


除了设备上下文外,其余的对象在选入DC中时,如果不将GDI对象从DC中释放,那么当该对象被析构时,其所指向的对象由于被占用很有可能无法释放。所以一定要用到SelectObject将选入的GDI对象选出。我们画图时编辑的函数如下:

CDC dc;//创建一个设备上下文对象dc
CPen myPen;//定义一个GDI (HPEN)对象myPen
myPen.CreatePen(PS_SOLID,3,RGB(255,0,0));//为GDI对象创建具体的属性
CPen *pOldPen =dc.SelectObject(&myPen);//将myPen选入到设备上下文dc中,返回原有对象的指针
dc.MoveTo(xx,xx);
dc.LineTo(xx,xx);
dc.SelectObject(pOldpen);//将就有的对象选入设备上下文dc中,从而释放myPen

如果最后一步dc.SelectObject(pOldpen);没有,那么myPen将一直在设备上下文dc中,此时如果释放myPen,那么析构函数有可能无法正确释放,从而造成资源泄露。

GDI对象的释放是在析构函数中完成的,这个不是重点,重点是我们一定要确保当GDI对象释放时其不能被其他占用。

参考链接:https://blog.csdn.net/benben853/article/details/6585600

猜你喜欢

转载自blog.csdn.net/wangyhwyh753/article/details/79753471