Начинающий В 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 просто реализует оболочку автоматического управления ресурсами. Государственное управление все еще требует явного кода.

Другие вопросы по тегам