请教一个关于SelectObject函数的问题

potato2008 2005-07-21 11:43:25
void CStringView::OnDraw(CDC* pDC)
{
int i,j,nHeight;
CString str;
CFont font;
TEXTMETRIC tm;

CPoemDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

pDC->Rectangle(m_rectPrint+CRect(0,0,-20,20));
j=m_rectPrint.Width()/1440;
for(i=0;i<=j;i++){
str.Format("%02d",i);
pDC->TextOut(i*1440,0,str);
}
j=-m_rectPrint.Height()/1440;
for(i=0;i<=j;i++){
str.Format("%02d",i);
pDC->TextOut(0,-i*1440,str);
}
font.CreateFont(-400,0,0,0,400,false,false,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,
"Times New Roman");
CFont* pOldFont=(CFont*)pDC->SelectObject(&font);
pDC->GetTextMetrics(&tm);
nHeight=tm.tmHeight+tm.tmExternalLeading;

j=pDoc->m_stringArray.GetSize();
for(i=0;i<j;i++){
pDC->TextOut(720,-i*nHeight-720,pDoc->m_stringArray[i]);
}

pDC->SelectObject(pOldFont);

}
上面程序中为什么要加入最后一行pDC->SelectObject(pOldFont);呢?我试过不加入也可以正常运行
...全文
964 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
potato2008 2005-07-25
  • 打赏
  • 举报
回复
谢谢各位了
greenabc 2005-07-23
  • 打赏
  • 举报
回复
记得一定要恢复,否则 pOldFont 之类GDI对象每运行一次它所在的 "函数" 就会增加一个泄漏,是很严重的问题。
greenabc 2005-07-23
  • 打赏
  • 举报
回复
恢复CDC,释放新创建的GDI对象CFont,否则会有GDI资源泄漏,
CFont font;
你是申明了一个局部GDI对象,出了作用域是会自动释放,
但良好的编程习惯要: 有Create 就要有DeleteObject相对应(手工释放GDI对象,也就是pDC->SelectObject(pOldFont);后要加一句:font.DeleteObject() )。
oyljerry 2005-07-23
  • 打赏
  • 举报
回复
相当于保存之前的字体等资源,用完恢复原来的
hongyi_7 2005-07-23
  • 打赏
  • 举报
回复
选择的设备也算是一种资源,用完之后再选择回来,为了避免资源的浪费。
xqk 2005-07-21
  • 打赏
  • 举报
回复
因为传进来上个CDC* pDC 的默认Font对象,当结束这个OnDraw调用后 CDC将根据这个CFont句柄释放这个CFont对象,否则OldFont对象的指针丢失,无法找到这个对象,内存泄漏

而最常用的做法:

因为CFont 一般使用的是局部成员,当SelectObject使用完这个对象的时候需要调用DeleteObject删除这个CFont对象,当然删除这个对象的时候你必须使CDC断开这个对象的句柄,才能安全删除,避免出现野指针情情...
kugou123 2005-07-21
  • 打赏
  • 举报
回复
那是为了还原以前的字体。用完以后总是要恢复的啊。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧