У меня проблема с настройкой шрифтов для статического текста

Моя проблема в том, что шрифт в тексте не будет отображаться как шрифт, который я хочу. Я поднял вопрос, но я не видел никаких решений. Текст - это «Вход в систему»,

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

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

    return TRUE;
}

Текст входа

Всего 1 ответ


Когда вы вызываете CWnd::SetFont() , окно, которому вы назначили шрифт, не получает права собственности на шрифт. Вы несете ответственность за удаление шрифта, но только тогда, когда он больше не используется .

Как часто документация по базовому API Windows, которая является WM_SETFONT , предоставляет больше информации, чем документация MFC:

Приложение должно вызывать функцию DeleteObject для удаления шрифта, когда он больше не нужен; например, после уничтожения элемента управления.

Поскольку вы используете класс CFont , вам не нужно явно вызывать DeleteObject() . CFont - это класс RAII, который автоматически уничтожает связанный с ним ресурс в своем деструкторе.

Все, что вам нужно, это CFont экземпляра 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; 
}

Теперь объект шрифта будет существовать для всего живого в диалоговом окне, включая его дочерние элементы. Вы могли бы даже назначить его другим детям по мере необходимости.


Есть идеи?

10000