我在设置静态文本字体时遇到问题

时间:2018-11-23 23:50:30

标签: c++ mfc

我的问题是文本中的字体不会显示为我想要的字体。我查了一下问题,但没有任何解决方案。文本为“登录”

BOOL Account::OnInitDialog() {
    CDialogEx::OnInitDialog();

    CFont font;
    VERIFY(font.CreatePointFont(160, _T("Arial")));
    SignInStatic.SetFont(&font);
    font.DeleteObject();

    return TRUE;
}

The Sign In Text

1 个答案:

答案 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; 
}

现在,字体对象将在对话框的整个生命周期中都存在,包括其子级。您甚至可以根据需要将其分配给其他孩子。