SelectObject和DeleteObject 函数

 

 

 

Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用SelectObject函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时Windows就会在内存里分配一块内存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成内存使用越来越多,最后导到Windows这幢大楼倒下来。如果你忘记删除它,就造成了内存泄漏。因此,当你创建显示设备资源时,一定要记得删除它们啊,否则运行你的程序越长,就导致系统不稳定。记得使用DeleteObject函数去删除它们,把占用的内存释放回去给系统。

 

函数SelectObjectDeleteObject声明如下:

 

WINGDIAPI HGDIOBJ WINAPI SelectObject(__in HDC hdc, __in HGDIOBJ h);

WINGDIAPI BOOL WINAPI DeleteObject( __in HGDIOBJ ho);

hDC是当前设备的句柄。

hho是设备对象,其实它就是内存的地址。

 

调用这个函数的例子如下:

#001 //

#002 //界面显示输出.

#003 //

#004 //蔡军生2007/09/01 QQ:9073204 深圳

#005 //

#006 void CCaiWinMsg::OnDraw(HDC hDC)

#007 {

#008  //

#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));

#010 

#011  //设置输出字符串的颜色.

#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));

#013

#014  RECT rcText;   

#015  rcText.left = 10;

#016  rcText.top = 10;

#017  rcText.right = 300;

#018  rcText.bottom = 80;

#019

#020  //创建黑色的画刷,

#021  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));

#022

#023  //用黑色的画刷填充四边形的颜色.

#024  FillRect(hDC,&rcText,hbrush);

#025

#026  //删除画刷.

#027  DeleteObject(hbrush);

#028

#029

#030  rcText.left = 10;

#031  rcText.top = 10;

#032  rcText.right = 300;

#033  rcText.bottom = 40;

#034

#035  //显示字符串在四边形的中间位置.

#036  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,

#037         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

#038

#039

#040  rcText.left = 10;

#041  rcText.top = 40;

#042  rcText.right = 300;

#043  rcText.bottom = 80;

#044  //设置透明背景

#045  int nOldMode = SetBkMode(hDC,TRANSPARENT);

#046

#047  //设置新字体.

#048  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());

#049

#050  //显示字符串在四边形的中间位置.

#051  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,

#052         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);

#053

#054  //恢复原来的字体.

#055  HGDIOBJ hFont = SelectObject(hDC,hOldFont);

#056  DeleteObject(hFont);

#057

#058  //恢复原来的模式.

#059  SetBkMode(hDC,nOldMode);

#060

#061  //恢复原来的颜色.

#062  SetTextColor(hDC,crOld);

#063 }

 

 

以上转自:http://blog.csdn.net/caimouse/archive/2007/09/05/1773850.aspx

 

 ////////////////////////////////////////////////

 

    CFont font;

    font.CreatePointFont(g_myFont,_T("宋体"));

    GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);

    CFont *pOldFont=pDC->SelectObject(&font);

    DeleteObject(pOldFont);

 //////////////////////////////////////////////////

BoundsChecker

发现有错误发生:Argument   1   in   DeleteObject(字体对象句柄值)   is   still   selected   in   to   hDC   0x01010058

 

 修改 :

 //////////////////////////////////////////////////

    //字体大小

    CFont font;

    font.CreatePointFont(g_myFont,_T("宋体"));

     CFont *pOldFont=pDC->SelectObject(&font);

    GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);//为控件附上字号

    pDC->SelectObject(pOldFont);

    DeleteObject(font);//释放资源

 //////////////////////////////////////////////////

 

 

 

 

另一列:

 ////////////////////////////////////////////////// 

    CRect rect;

    CDC* pDC=GetDC();

    GetWindowRect(&rect);

    CPen spen;

//被选中,显示红色,否则显示灰色

    if(bIsSelect)spen.CreatePen(PS_SOLID,3,RGB(0,255,0));

    else spen.CreatePen(PS_SOLID,3,RGB(192,192,192));

    pDC->SelectObject(&spen);

    pDC->SelectObject(GetStockObject(NULL_BRUSH));//选择透明填充

    pDC->Rectangle(0,0,rect.Width()-3,rect.Height()-3);

    ReleaseDC(pDC);

 //////////////////////////////////////////////////

 

 

修改:

  //////////////////////////////////////////////////

 

    CRect rect;

    CDC* pDC=GetDC();

    GetWindowRect(&rect);

    CPen spen;

//被选中,显示红色,否则显示灰色

    if(bIsSelect)spen.CreatePen(PS_SOLID,3,RGB(0,255,0));

    else spen.CreatePen(PS_SOLID,3,RGB(192,192,192));

    CPen *pSpen = pDC->SelectObject(&spen);

    pDC->SelectObject(GetStockObject(NULL_BRUSH));//选择透明填充

    pDC->Rectangle(0,0,rect.Width()-3,rect.Height()-3);

    pDC->SelectObject(pSpen);

    DeleteObject(spen);//释放资源

    ReleaseDC(pDC);

  //////////////////////////////////////////////////

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值