MFC中关于CGdiObject类的Detach()函数,询问该函数存在的意义 25

voidCWinDialogDlg::OnBtnFont(){CFont*Font=m_FileText.GetFont();CFont*m_CFont=NULL;LOG... void CWinDialogDlg::OnBtnFont()
{
CFont *Font=m_FileText.GetFont();
CFont *m_CFont=NULL;
LOGFONT LogFont;
Font->GetLogFont(&LogFont); //获取字体原先信息
CFontDialog dlg(&LogFont); //初始化字体信息(即在字体对话框中标明起先的字体信息)
if(dlg.DoModal()==IDOK)
{

m_Font.Detach();

LOGFONT temp;
dlg.GetCurrentFont(&temp); //在字体对话框中选择的字体信息
m_Font.CreateFontIndirect(&temp); //直接创建字体信息为“temp”的字体
m_FileText.SetFont(&m_Font);
}
}
m_Font是在CWinDialogDlg类中定义的成员变量,这里我有个疑问,就是为何要添加“m_Font.Detach()"这行代码?Detach()在文中的说明是将一个Windows GDI对象从CGdiObject对象上拆下,并返回Windows GDI对象的句柄 ,但我还是不明白,可以为我详细解释一下这里的用法和原因么?
展开
 我来答
空雪梦见
2013-04-20 · TA获得超过5598个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1227万
展开全部
正常情况下你那个m_Font对象在析构的时候会销毁里面的HFONT对吧。
现在这个HFONT对你有用,但是CFont对你没用,你想把CFont销毁但是又要保留HFONT
于是你用这个把HFONT从里面分离出来,Detach以后这个HFONT就和CFont没关系了,不会随着CFont的析构而被销毁

没用过mfc,这是我自己的理解。
……总感觉哪里不对啊,你这样m_Font就Detach掉了那它的HFONT呢?就这么没销毁、泄露掉了?如果是用到其他地方了那倒是无所谓……不是的话就那啥那啥那啥啥(内存泄漏)了
追问
m_Font是在CWinDialogDlg类中定义的成员变量,也就是说该变量在程序运行过程中它的生命周期还没有结束啊
追答
我想也有可能是它不确定是不是已经create过了。
mfc里面多次调用create而不detach的话会报错吗?
duyc_th_bj
2013-04-20
知道答主
回答量:2
采纳率:0%
帮助的人:3004
展开全部
m_Font可能已经不含了一个有效的字体,这时必须先释放它,再CreateFont();和指针的用法类似。
我一般习惯用 m_Font.DeleteObject();,效果一样的。
追问
是这样的,我把m_Font.Detach(); 给删除掉运行,按下控件打开字体设置的对话框后选择一种格式确定,文本里按照所选格式正常显示,当我再次按下该控件打开字体设置的对话框后选择一种样式然后确定,此时就弹出一个错误窗口使得程序终止了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式