Рисование текста
Для рисования текста с помощью Direct2D используйте метод ID2D1RenderTarget::D rawText для текста с одним форматом. Или используйте метод ID2D1RenderTarget::D rawTextLayout для нескольких форматов, расширенных функций OpenType или проверки нажатия. Эти методы используют API DirectWrite для обеспечения высококачественного отображения текста.
Метод DrawText
Чтобы нарисовать текст в одном формате, используйте метод DrawText . Чтобы использовать этот метод, сначала используйте IDWriteFactory для создания экземпляра IDWriteTextFormat .
Следующий код создает объект IDWriteTextFormat и сохраняет его в переменной m_pTextFormat .
// Create resources which are not bound
// to any device. Their lifetime effectively extends for the
// duration of the app. These resources include the Direct2D and
// DirectWrite factories, and a DirectWrite Text Format object
// (used for identifying particular font characteristics).
//
HRESULT DemoApp::CreateDeviceIndependentResources()
{
static const WCHAR msc_fontName[] = L"Verdana";
static const FLOAT msc_fontSize = 50;
HRESULT hr;
// Create a Direct2D factory.
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory);
if (SUCCEEDED(hr))
{
// Create a DirectWrite factory.
hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(m_pDWriteFactory),
reinterpret_cast<IUnknown **>(&m_pDWriteFactory)
);
}
if (SUCCEEDED(hr))
{
// Create a DirectWrite text format object.
hr = m_pDWriteFactory->CreateTextFormat(
msc_fontName,
NULL,
DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
msc_fontSize,
L"", //locale
&m_pTextFormat
);
}
if (SUCCEEDED(hr))
{
// Center the text horizontally and vertically.
m_pTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER);
m_pTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER);
}
return hr;
}
Так как объекты IDWriteFactory и IDWriteTextFormat являются независимыми от устройства ресурсами, вы можете повысить производительность приложения, создавая их только один раз, а не повторно создавать каждый раз при отрисовке кадра.
После создания объекта текстового формата его можно использовать с целевым объектом отрисовки. Следующий код рисует текст с помощью метода DrawText целевого объекта отрисовки (переменная m_pRenderTarget ).
// Called whenever the application needs to display the client
// window. This method writes "Hello, World"
//
// Note that this function will automatically discard device-specific
// resources if the Direct3D device disappears during function
// invocation, and will recreate the resources the next time it's
// invoked.
//
HRESULT DemoApp::OnRender()
{
HRESULT hr;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
static const WCHAR sc_helloWorld[] = L"Hello, World!";
// Retrieve the size of the render target.
D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
m_pRenderTarget->DrawText(
sc_helloWorld,
ARRAYSIZE(sc_helloWorld) - 1,
m_pTextFormat,
D2D1::RectF(0, 0, renderTargetSize.width, renderTargetSize.height),
m_pBlackBrush
);
hr = m_pRenderTarget->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
hr = S_OK;
DiscardDeviceResources();
}
}
return hr;
}
Метод DrawTextLayout
Метод DrawTextLayout отрисовывает объект IDWriteTextLayout . Этот метод используется для применения нескольких форматов к блоку текста (например, подчеркивания части текста), для использования расширенных функций OpenType или для выполнения поддержки проверки попадания.
Метод DrawTextLayout также обеспечивает преимущества производительности для многократного рисования одного и того же текста. Объект IDWriteTextLayout измеряет и размещает текст при его создании. Если создать объект IDWriteTextLayout только один раз и повторно использовать его при каждом перерисовке текста, производительность повысится, так как системе не нужно измерять и выкладывать текст снова.
Прежде чем использовать метод DrawTextLayout , необходимо использовать IDWriteFactory для создания объектов IDWriteTextFormat и IDWriteTextLayout . После создания этих объектов вызовите метод DrawTextLayout .
Дополнительные сведения и примеры см. в статье Общие сведения о форматировании текста и макете .
Связанные темы