CEdit::GetFont() возвращает NULL
От: kimsite Россия http://kimsite.wallst.ru
Дата: 15.04.03 17:24
Оценка:
Наверное, все знают сайт "Первые шаги": "MFC шаг за шагом".
Заглянем во второй шаг:
http://www.firststeps.ru/mfc/steps/2.html

Там просто создается динамическое (из указателя CEdit*) текстовое поле с именем MyEdit.
Сразу после создания, когда на форму положим MyEdit, заполним его текстом "qwerty".
И вернем результат. Естественно, все получилось.
А если попытаться получить текущий шрифт MyEdit, то вернется NULL.
Как быть?
Надеюсь на помощь.
Ниже привожу соответствующий код.
CMainWnd::CMainWnd()
{
 Create(NULL, "Step2", WS_OVERLAPPEDWINDOW, rectDefault, NULL, NULL);
 MyEdit = new CEdit();
 if (MyEdit!=NULL) MyEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER,
   CRect(240,10,340,50),this,IDC_MYEDIT);

 MyEdit->SetWindowText("qwerty");
 CString strText;
 MyEdit->GetWindowText(strText);
 // Как и положено, вернулась строка "qwerty"
 AfxMessageBox(strText);

 CFont *objFont;
 objFont = new CFont;
 // Получаем указатель на текущий шрифт MyEdit
 objFont = MyEdit->GetFont();
 if (objFont == NULL)
 {
  // Возвращаем предупреждение
  AfxMessageBox("font empty");
 }
 else
 {
  // Возвращаем имя шрифта
  LOGFONT objLog;
  objFont->GetLogFont(&objLog);
  AfxMessageBox(objLog.lfFaceName);
 }
}
Re: CEdit::GetFont() возвращает NULL
От: Serguei666 Беларусь  
Дата: 15.04.03 18:32
Оценка:
Здравствуйте, kimsite, Вы писали:

K>Наверное, все знают сайт "Первые шаги": "MFC шаг за шагом".

K>Заглянем во второй шаг:
K>http://www.firststeps.ru/mfc/steps/2.html

K>Там просто создается динамическое (из указателя CEdit*) текстовое поле с именем MyEdit.

K>Сразу после создания, когда на форму положим MyEdit, заполним его текстом "qwerty".
K>И вернем результат. Естественно, все получилось.
K>А если попытаться получить текущий шрифт MyEdit, то вернется NULL.
K>Как быть?
Как быть с чем? Что вас смущает?

K>Надеюсь на помощь.

Поможем обязательно.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[2]: CEdit::GetFont() возвращает NULL
От: kimsite Россия http://kimsite.wallst.ru
Дата: 16.04.03 05:12
Оценка:
У меня есть указатель на CFont. Мне нужно, чтобы он указывал на текущий шрифт текстового поля, а точнее указывал на такой экземпляр CFont, который является точной копией, который возвращает GetFont().
Спасибо.
Re[3]: CEdit::GetFont() возвращает NULL
От: Serguei666 Беларусь  
Дата: 16.04.03 12:42
Оценка:
Здравствуйте, kimsite, Вы писали:

K>У меня есть указатель на CFont. Мне нужно, чтобы он указывал на текущий шрифт текстового поля, а точнее указывал на такой экземпляр CFont, который является точной копией, который возвращает GetFont().

Понятно.
Я бы делал так:
Вы создаете фонт сами и потом устанавливаете его в EditControl. В таком случае GetFont будет возвращать не NULL, но вам его вызывать и не потребуется.

CMainWnd::CMainWnd()
{
...

CFont *objFont = new CFont;
objFont->CreateFont(...) // Создаете фонт тут, вызвав CreateFont или CreateFontIndirect()
// Ставите указатель на текущий фонт в MyEdit
MyEdit->SetFont(objFont);

// Возвращаем имя шрифта
LOGFONT objLog;
objFont->GetLogFont(&objLog);
AfxMessageBox(objLog.lfFaceName);
}

Или это не то, что вам надо?
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re: Кстати, у вас тут в коде memory leak
От: Serguei666 Беларусь  
Дата: 16.04.03 12:46
Оценка: +1
Здравствуйте, kimsite, Вы писали:

Данный отрезок кода породит memory leak (исключение блока памяти из оборота).

K> CFont *objFont;

K> objFont = new CFont; // тут вы выделяете блок памяти
K> objFont = MyEdit->GetFont(); // ты вы теряете указатель на выделенный блок памяти.

Не нужно выделять блок памяти в вашем случае. Правильно так:

CFont *objFont = MyEdit->GetFont();
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re: CEdit::GetFont() возвращает NULL
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.04.03 12:46
Оценка:
Здравствуйте, kimsite, Вы писали:

K>А если попытаться получить текущий шрифт MyEdit, то вернется NULL.


Насколько я помню, сие означает что данное поле ввода использует стандартный системный шрифт. Если Вам нужны его метрики, можно получить соответствующий хэндл через GetStockObject(), ну и...
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.