设置字体为什么会出错?

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);

...全文
269 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%时出错在什么地方吧...
内容概要:本文围绕基于深度学习分类的时相关MIMO信道递归CSI量化技术展开研究,提出一种结合深度学习模型的递归式信道状态信息(CSI)反馈优化方法。该方法针对无线通信系统中时变MIMO信道的特点,利用深度学习网络对信道时序特征进行有效提取与分类,实现高精度、低开销的CSI量化与反馈,从而提升大规模MIMO系统的频谱效率与传输性能。研究不仅涵盖了算法设计与模型构建,还提供了完整的Matlab代码实现,便于验证与复现,适用于现代高性能无线通信系统的优化需求。; 适合人群:具备通信系统理论基础、熟悉MIMO与信道反馈机制,并掌握Matlab编程技能的研究生、科研人员及从事5G/6G通信、智能信号处理与深度学习在通信中应用的工程技术人员。; 使用场景及目标:①研究MIMO系统中基于深度学习的CSI反馈压缩与重建技术;②探索时序信道建模与递归量化机制的深度融合方法;③复现并改进现有算法,支撑高水平学术论文撰写或通信系统原型开发。; 阅读建议:建议读者结合提供的Matlab代码逐模块调试,深入理解深度学习分类网络与时序递归量化策略的协同工作机制,重点关注特征提取、分类决策与量化更新等关键环节的设计逻辑,并可尝试迁移至不同信道模型或引入更先进网络结构以进一步提升性能。

15,976

社区成员

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

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