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对象的句柄 ,但我还是不明白,可以为我详细解释一下这里的用法和原因么? 展开
{
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对象的句柄 ,但我还是不明白,可以为我详细解释一下这里的用法和原因么? 展开
2个回答
展开全部
正常情况下你那个m_Font对象在析构的时候会销毁里面的HFONT对吧。
现在这个HFONT对你有用,但是CFont对你没用,你想把CFont销毁但是又要保留HFONT
于是你用这个把HFONT从里面分离出来,Detach以后这个HFONT就和CFont没关系了,不会随着CFont的析构而被销毁
没用过mfc,这是我自己的理解。
……总感觉哪里不对啊,你这样m_Font就Detach掉了那它的HFONT呢?就这么没销毁、泄露掉了?如果是用到其他地方了那倒是无所谓……不是的话就那啥那啥那啥啥(内存泄漏)了
现在这个HFONT对你有用,但是CFont对你没用,你想把CFont销毁但是又要保留HFONT
于是你用这个把HFONT从里面分离出来,Detach以后这个HFONT就和CFont没关系了,不会随着CFont的析构而被销毁
没用过mfc,这是我自己的理解。
……总感觉哪里不对啊,你这样m_Font就Detach掉了那它的HFONT呢?就这么没销毁、泄露掉了?如果是用到其他地方了那倒是无所谓……不是的话就那啥那啥那啥啥(内存泄漏)了
追问
m_Font是在CWinDialogDlg类中定义的成员变量,也就是说该变量在程序运行过程中它的生命周期还没有结束啊
追答
我想也有可能是它不确定是不是已经create过了。
mfc里面多次调用create而不detach的话会报错吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询