设置字体为什么会出错?

ahcpx 2006-05-27 06:27:18
我想在滚动条上用TEXTOUT输出文字,但文字太大的,我想改变下字体,我就用下面方面更改成功了,但开始运行没什么问题,当滚动条每次到79%时就会出错,不知道是怎么回事,帮我看看吧.

CRect recttext;
CDC *pDc=m_Progress.GetWindowDC();
//设置输出文字字体大小
CFont font;
font.CreateFont(12,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("Aerial"));
CFont *pOldFont = (CFont*)pDc->SelectObject(&font);

m_Progress.GetClientRect(&recttext);
pDc->TextOut(recttext.Width()/2,1,"10%");
pDc->SelectObject(&pOldFont);

...全文
271 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahcpx 2006-05-27
  • 打赏
  • 举报
回复
噢,新手,刚学新手,对于一些总是不明白,不知道哪些该释放、该释放什么,谢谢二位的回答,问题解决了
折腾_苏州 2006-05-27
  • 打赏
  • 举报
回复
你写的代码有很大的问题^-^
1.首先在10000次循环体内不断的在栈上分配空间,疯狂的CreateFont,系统能受的了么。
要摆在外面定义嘛...
2.font.CreateFont创建完记得销毁 pOldFont->Detach();font.Detach();
3.使用Progress一般都是用WM_TIMER事件,不推荐这种占CPU的循环...
稍微改过的,参考一下:
int progresspos=0;
CString tem;
CRect recttext;
CFont font;
COLORREF clr;
CDC *pDc;
CFont *pOldFont;
font.CreateFont(12,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("Aerial"));
for(int i=0;i<=1000;i++)
{
progresspos=i*100/1000;
if(progresspos>100)break;
m_Progress.SetPos(progresspos);
pDc=m_Progress.GetWindowDC();
//设置输出文字字体大小
pOldFont = (CFont*)pDc->SelectObject(&font);

m_Progress.GetClientRect(&recttext);
clr=pDc->GetPixel((recttext.Width()/2)+15 ,3);
tem.Format("%d",progresspos);
pDc->TextOut((recttext.Width()/2)-2,1,tem);
pDc->SelectObject(&pOldFont);
}
pOldFont->Detach();
font.Detach();
NetDraw 2006-05-27
  • 打赏
  • 举报
回复
你的代码中有严重的资源泄漏,这里主要是因为你的DC(CDC *pDc=m_Progress.GetWindowDC();)创建了代码之后就一直没有释放,所以到了79%时,也就差不多有7900个DC句柄了,这已经达到了系统的最大限制,所以你应该把这段代码改一下,如下:
int progresspos=0;
CString tem;
for(int i=0;i<=10000;i++)
{
progresspos=i*100/10000;
m_Progress.SetPos(progresspos);
CRect recttext;
//下面获取DC时,其实最好是从客户区来获取,也就是代码最好写成
//CDC *pDc=m_Progress.GetDC();
CDC *pDc=m_Progress.GetWindowDC();
//设置输出文字字体大小
CFont font;
font.CreateFont(12,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("Aerial"));
CFont *pOldFont = (CFont*)pDc->SelectObject(&font);

m_Progress.GetClientRect(&recttext);
COLORREF clr=pDc->GetPixel((recttext.Width()/2)+15 ,3);
tem.Format(L"%d",progresspos);
pDc->TextOut((recttext.Width()/2)-2,1,tem);
pDc->SelectObject(&pOldFont);
//新加的代码
m_Progress.ReleaseDC(pDc);
font.DeleteObject();

}
ahcpx 2006-05-27
  • 打赏
  • 举报
回复
搞不明白是怎么回事,你运行下下面这段代码就知道了,很怪啊
int progresspos=0;
CString tem;
for(int i=0;i<=10000;i++)
{
progresspos=i*100/10000;
m_Progress.SetPos(progresspos);
CRect recttext;
CDC *pDc=m_Progress.GetWindowDC();
//设置输出文字字体大小
CFont font;
font.CreateFont(12,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,_T("Aerial"));
CFont *pOldFont = (CFont*)pDc->SelectObject(&font);

m_Progress.GetClientRect(&recttext);
COLORREF clr=pDc->GetPixel((recttext.Width()/2)+15 ,3);
tem.Format(L"%d",progresspos);
pDc->TextOut((recttext.Width()/2)-2,1,tem);
pDc->SelectObject(&pOldFont);
}
折腾_苏州 2006-05-27
  • 打赏
  • 举报
回复
从你给出的这段代码来看没有问题,你还是在调试模式下每次到79%时出错在什么地方吧...

15,975

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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