У меня проблема с настройкой шрифтов для статического текста - PullRequest
0 голосов
/ 24 ноября 2018

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

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 голосов
/ 24 ноября 2018

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...