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