我需要反复的使用“同一个”CPen对象的CreatePen成员函数来创造不同属性的笔进行绘图,需不需要在后续的CreatePen之前作些什么操作??特 谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 需要调用DeleteObject,为什么?因为每次调用CreatePen就会创建一个GDI对象,如果你不是放(DeleteObject)的话系统的GDI对象就会耗尽,而且不能恢复,很快你就要重起计算机了。 呵呵,开玩笑啊!在使用GDI对象(如pen,brush,font,bitmap等)时,要把它们选入设备描述表中; 用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。 下面的例子演示如何删除GDI对象: CPen pen(PS_SOLID, 1, RGB(0, 128, 128)); CPen* pPrevPen = pDC->SelectObject(&pen); CBrush brush(RGB(0, 128, 128)); CBrush* pPrevBrush = pDC->SelectObject(&brush); ... pDC->SelectObject(pPrevPen); pDC->SelectObject(pPrevBrush); pen.DeleteObject(); brush.DeleteObject(); 我跟踪进去看了DeleteObject的源代码的,在winhand.cpp第189行的下面这些代码是在进行判断,谁知道这是在干什么吗?不理解release版中没有这些判断,直接删除。void CHandleMap::RemoveHandle(HANDLE h){ // make sure the handle entry is consistent before deleting CObject* pTemp = LookupTemporary(h); if (pTemp != NULL) { // temporary objects must have correct handle values HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject ASSERT(ph[0] == h || ph[0] == NULL); if (m_nHandles == 2) ASSERT(ph[1] == h); } carbon107(<软件开发思想.h>) :为什么说“用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。”难道DC里面不是保存的一个CPen的备份吗? 一楼说的有道理,使用之前一定要先判断有没有已经存在的GDI对象,如果有先把旧的对象用DeleteObject()删除,否则回造成内存泄露,再创建新的将要使用的对象,用SelectObject()函数把新创建的GDI对象选入当前设备场景,用完之后要恢复以前的设置!释放资源,使用GDI对象一定要注意资源的释放! 同意 carbon107(<软件开发思想.h>) 必须“选出来”,否则删除没用 怎样在保存已有文件时弹出提示对话框啊? 问个基本的常识,是不是Edit控件根本不能自动换行 我的VC有问题 UDP结构体问题 [GDI+] 使用GDI+是否可以基本实现VISIO画图的效果? 两个进程同时在CView 上画图(在大图上再画小图),怎么样解决闪烁问题??? 一个ActiveX的问题 免费开放FTP + 送分,可上传可下载,全部有分.... 如何把客户区的内容截取保存到CBitmap变量中? ???为什么我用VC在ATL复合控件中调用BITMAP资源和自定义资源都不成功(内详) MFC应用程序框架中的封装问题_新手上路_马上给分 请问哪位大侠有TIF图象格式的详细汉语说明的?
用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。
下面的例子演示如何删除GDI对象:
CPen pen(PS_SOLID, 1, RGB(0, 128, 128));
CPen* pPrevPen = pDC->SelectObject(&pen);
CBrush brush(RGB(0, 128, 128));
CBrush* pPrevBrush = pDC->SelectObject(&brush);
...
pDC->SelectObject(pPrevPen);
pDC->SelectObject(pPrevBrush);
pen.DeleteObject();
brush.DeleteObject();
void CHandleMap::RemoveHandle(HANDLE h)
{
// make sure the handle entry is consistent before deleting
CObject* pTemp = LookupTemporary(h);
if (pTemp != NULL)
{
// temporary objects must have correct handle values
HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject
ASSERT(ph[0] == h || ph[0] == NULL);
if (m_nHandles == 2)
ASSERT(ph[1] == h);
}
为什么说“用完后必须把它们从设备描述表中选出才可删除,否则删除是无效的。”
难道DC里面不是保存的一个CPen的备份吗?
DeleteObject()删除,否则回造成内存泄露,再创建新的将要使用的对象,用SelectObject()函数把新创建的GDI对象选入当前设备场景,用完之后要恢复以前的设置!释放资源,使用GDI对象一定要注意资源的释放!
必须“选出来”,否则删除没用