关于GDI对象的删除
首先,C++对象与GDI对象是两个不同的东西,在MFC中,若是由CGdiObject类派生而来的类,则其C++对象中包含了GDI的对象
1、
对于CGdiObject object其中包含一个函数DelteObject()此函数的功能为删除类对象中相应的GDI对象,比如CPen pen(..) 定议了一个pen对象并初始化, 则此pen对象中,就包含有一个GID的画笔句柄,当你调用pen.DeleteObject()函数时,pen对象中所包含的画笔句柄将会被释放,画笔句柄不再与此CPen对象联系在一起了,所以你可以通过调用pen.CreatePen(...)函数再向系统申请一个GDI画笔句柄,将此句柄与此CPen对象相联系。
若MFC 中,CGdiObject的派生类对象在栈上创建,则当对象消亡时,其析构函数会调用成员函数DeleteObject()来实现GDI对象的释放。若对象在堆上用new创建,则要delete之,以便调用析构函数。
2、
对于CBrush类
若你用obj1=new CBrush(...),obj2=new CBrush(...)创建了两个一模一样的画刷,那么系统为了节约GDI资源只会创建一个GID的画刷句柄,并让此句柄与这两个画刷对象联系在一起。
若你执行如下语句:CBrush preturn; dc.SelectObjec(obj1);preturn= dc.SelectStockObject(WHITE_BRUSH); 你无法确定preturn 的值是obj1,还是obj2.为什么呢?因为,CDC::SelectObjct()用到由MFC维护的表格,把从::SelectObject()返回的HBRUSH转化为CBrush的指针,表格形成HBRUSH与CBrush间的一一映射,所以返回来的指针你没法确定是obj1,还是
obj2
首先,C++对象与GDI对象是两个不同的东西,在MFC中,若是由CGdiObject类派生而来的类,则其C++对象中包含了GDI的对象
1、
对于CGdiObject object其中包含一个函数DelteObject()此函数的功能为删除类对象中相应的GDI对象,比如CPen pen(..) 定议了一个pen对象并初始化, 则此pen对象中,就包含有一个GID的画笔句柄,当你调用pen.DeleteObject()函数时,pen对象中所包含的画笔句柄将会被释放,画笔句柄不再与此CPen对象联系在一起了,所以你可以通过调用pen.CreatePen(...)函数再向系统申请一个GDI画笔句柄,将此句柄与此CPen对象相联系。
若MFC 中,CGdiObject的派生类对象在栈上创建,则当对象消亡时,其析构函数会调用成员函数DeleteObject()来实现GDI对象的释放。若对象在堆上用new创建,则要delete之,以便调用析构函数。
2、
对于CBrush类
若你用obj1=new CBrush(...),obj2=new CBrush(...)创建了两个一模一样的画刷,那么系统为了节约GDI资源只会创建一个GID的画刷句柄,并让此句柄与这两个画刷对象联系在一起。
若你执行如下语句:CBrush preturn; dc.SelectObjec(obj1);preturn= dc.SelectStockObject(WHITE_BRUSH); 你无法确定preturn 的值是obj1,还是obj2.为什么呢?因为,CDC::SelectObjct()用到由MFC维护的表格,把从::SelectObject()返回的HBRUSH转化为CBrush的指针,表格形成HBRUSH与CBrush间的一一映射,所以返回来的指针你没法确定是obj1,还是
obj2