Поделиться через


Отрисовка с помощью Direct2D

Direct2D предоставляет методы для отрисовки либо текста с форматированием, описанным только через IDWriteTextFormat, либо через IDWriteTextLayout на поверхности Direct2D.

Отрисовка текста, описанного с использованием IDWriteTextFormat

Чтобы отобразить строку с помощью объекта IDWriteTextFormat, чтобы описать форматирование всей строки, используйте метод ID2D1RenderTarget::DrawText, предоставляемый Direct2D.

  1. Определите область для текстового макета, извлекая измерения области отрисовки и создав прямоугольник Direct2D с одинаковыми измерениями.

    D2D1_RECT_F layoutRect = D2D1::RectF(
        static_cast<FLOAT>(rc.left) / dpiScaleX_,
        static_cast<FLOAT>(rc.top) / dpiScaleY_,
        static_cast<FLOAT>(rc.right - rc.left) / dpiScaleX_,
        static_cast<FLOAT>(rc.bottom - rc.top) / dpiScaleY_
        );
    
    
  2. Используйте метод ID2D1RenderTarget::DrawText и объект IDWriteTextFormat для отображения текста на экране. Метод ID2D1RenderTarget::DrawText принимает следующие параметры:

    • Строка для визуализации.
    • Указатель на интерфейс IDWriteTextFormat.
    • Прямоугольник макета Direct2D.
    • Указатель на интерфейс, предоставляющий ID2D1Brush.
    pRT_->DrawText(
        wszText_,        // The string to render.
        cTextLength_,    // The string's length.
        pTextFormat_,    // The text format.
        layoutRect,       // The region of the window where the text will be rendered.
        pBlackBrush_     // The brush used to draw the text.
        );
    
    

Отрисовка объекта макета IDWriteText

Чтобы нарисовать текст с параметрами макета текста, заданными объектом IDWriteTextLayout, измените код в методе MultiformattedText::DrawText, чтобы использовать IDWriteTextLayout::DrawTextLayout.

  1. Объявите переменную D2D1_POINT_2F и установите ее в верхнюю левую точку окна.

    D2D1_POINT_2F origin = D2D1::Point2F(
        static_cast<FLOAT>(rc.left / dpiScaleX_),
        static_cast<FLOAT>(rc.top / dpiScaleY_)
        );
    
    
  2. Нарисуйте текст на экране, вызвав метод ID2D1RenderTarget::DrawTextLayout целевого объекта отрисовки Direct2D и передав указатель IDWriteTextLayout.

    pRT_->DrawTextLayout(
        origin,
        pTextLayout_,
        pBlackBrush_
        );