Начинающий В MFC C++, почему контекст устройства должен создать старый указатель Font/Bitmap/etc, а затем выбрать его в конце?
Дело в точке:
void CMainWindow::OnPaint ()
{
CRect rect;
GetClientRect (&rect);
CPaintDC dc (this);
dc.SetViewportOrg (rect.Width () / 2, rect.Height () / 2);
dc.SetBkMode (TRANSPARENT);
for (int i=0; i<3600; i+=150) {
LOGFONT lf;
::ZeroMemory (&lf, sizeof (lf));
lf.lfHeight = 160;
lf.lfWeight = FW_BOLD;
lf.lfEscapement = i;
lf.lfOrientation = i;
::lstrcpy (lf.lfFaceName, _T ("Arial"));
CFont font;
font.CreatePointFontIndirect (&lf);
CFont* pOldFont = dc.SelectObject (&font);
dc.TextOut (0, 0, CString (_T (" Hello, MFC")));
//WHY THIS LINE?
dc.SelectObject (pOldFont);
}
}
Код печатает " Hello, MFC" по кругу вокруг источника (который перемещен в центр окна).
Почему создается указатель CFont, а затем DC выбирает его в качестве шрифта? Это просто хорошая практика программирования или это приложение действительно нужно?
Я видел похожий код в Интернете, который делал это с растровыми изображениями и другими объектами контекста устройства. Какова цель?
Когда я удаляю эту последнюю строку кода, ничего не меняется. Заранее спасибо за помощь.
1 ответ
Контекст устройства - это структура, которая определяет набор графических объектов и связанных с ними атрибутов, а также графические режимы, влияющие на вывод. Графические объекты включают в себя перо для рисования линий, кисть для рисования и заливки, растровое изображение для копирования или прокрутки частей экрана, палитру для определения набора доступных цветов, область для обрезки и других операций, а также путь для малярные и чертежные работы.
В любой момент в контекст устройства выделяется ровно один графический объект. Поскольку система сохраняет набор объектов по умолчанию в контексте устройства при его создании, приложение должно сохранять это состояние, когда контекст устройства возвращается в систему для очистки. Что это
dc.SelectObject (pOldFont);
Ответственный за.
Это требование задокументировано под SelectObject:
Эта функция возвращает ранее выбранный объект указанного типа. Приложение всегда должно заменять новый объект оригинальным объектом по умолчанию после завершения рисования новым объектом.
Примечание. Это относится не к MFC, а к Windows GDI. MFC просто реализует оболочку автоматического управления ресурсами. Государственное управление все еще требует явного кода.