我的问题是文本中的字体不会显示为我想要的字体。我查了一下问题,但没有任何解决方案。文本为“登录”
BOOL Account::OnInitDialog() {
CDialogEx::OnInitDialog();
CFont font;
VERIFY(font.CreatePointFont(160, _T("Arial")));
SignInStatic.SetFont(&font);
font.DeleteObject();
return TRUE;
}
答案 0 :(得分:2)
调用CWnd::SetFont()
时,分配字体的窗口不拥有该字体的所有权。您有责任删除字体,但只能删除不再使用的字体。
通常,基础Windows API的文档WM_SETFONT
比MFC文档提供更多信息:
应用程序应调用DeleteObject函数以删除 不再需要的字体;例如,它摧毁了 控制。
使用CFont
类时,不必显式调用DeleteObject()
。 CFont
是一个RAII类,它会在销毁器中自动销毁其关联的资源。
您只需关心CFont
实例的作用域。当前,您在CFont
方法中创建了OnInitDialog
的局部变量。即使您删除了明确的DeleteObject
调用,当OnInitDialog
返回时,字体也将被销毁,并且分配了字体的窗口现在引用了无效的字体句柄。
将CFont
的实例声明为Account
类的成员变量:
class Account : public CDialogEx
{
public:
// Some stuff
private:
CFont m_signInFont;
};
在OnInitDialog
中,您必须使用成员变量而不是局部变量并删除DeleteObject
调用:
BOOL Account::OnInitDialog() {
CDialogEx::OnInitDialog();
VERIFY(m_signInFont.CreatePointFont(160, _T("Arial")));
SignInStatic.SetFont(&m_signInFont);
return TRUE;
}
现在,字体对象将在对话框的整个生命周期中都存在,包括其子级。您甚至可以根据需要将其分配给其他孩子。