Windows API一日一练(29)SelectObject和DeleteObject函数

    技术2022-05-11  72

    Windows 显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时 Windows 就会在内存里分配一块内存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成内存使用越来越多,最后导到 Windows 这幢大楼倒下来。如果你忘记删除它,就造成了内存泄漏。因此,当你创建显示设备资源时,一定要记得删除它们啊,否则运行你的程序越长,就导致系统不稳定。记得使用 DeleteObject 函数去删除它们,把占用的内存释放回去给系统。   函数 SelectObject DeleteObject 声明如下:   WINGDIAPI HGDIOBJ WINAPI SelectObject(__in HDC hdc, __in HGDIOBJ h); WINGDIAPI BOOL WINAPI DeleteObject( __in HGDIOBJ ho); hDC 是当前设备的句柄。 h ho 是设备对象,其实它就是内存的地址   调用这个函数的例子如下: #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 }    

    最新回复(0)