При вызове 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;
}
Теперь объект шрифта будет существовать в течение всего времени существования диалога, включая его дочерние элементы.При необходимости вы можете даже назначить его другим детям.