Jak rysować tekst
Aby narysować tekst przy użyciu Direct2D, użyj metody ID2D1RenderTarget::DrawText dla tekstu, który ma jeden format. Możesz też użyć metody ID2D1RenderTarget::DrawTextLayout w przypadku wielu formatów, zaawansowanych funkcji OpenType lub testowania trafień. Te metody używają interfejsu API DirectWrite do zapewnienia wysokiej jakości wyświetlania tekstu.
Metoda DrawText
Aby narysować tekst, który ma pojedynczy format, użyj metody DrawText. Aby użyć tej metody, najpierw użyj IDWriteFactory, aby utworzyć wystąpienie IDWriteTextFormat.
Poniższy kod tworzy obiekt IDWriteTextFormat i przechowuje go w zmiennej 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;
}
Ponieważ IDWriteFactory i IDWriteTextFormat obiekty są zasobami niezależnymi od urządzenia, można poprawić wydajność aplikacji, tworząc je tylko raz, zamiast ponownie tworzyć je za każdym razem, gdy klatka jest renderowana.
Po utworzeniu obiektu formatu tekstu można go użyć z obiektem docelowym renderowania. Poniższy kod rysuje tekst przy użyciu metody DrawText obiektu docelowego renderowania (zmiennej 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;
}
Metoda DrawTextLayout
Metoda DrawTextLayout renderuje obiekt IDWriteTextLayout. Użyj tej metody, aby zastosować wiele formatów do bloku tekstu (na przykład podkreślenia części tekstu), aby użyć zaawansowanych funkcji OpenType lub wykonać obsługę testowania trafień.
Metoda DrawTextLayout zapewnia również korzyści w zakresie wydajności wielokrotnego rysowania tego samego tekstu. IDWriteTextLayout mierzy i układa tekst swojego obiektu podczas jego tworzenia. Jeśli utworzysz obiekt IDWriteTextLayout tylko raz i ponownie użyjesz go za każdym razem, gdy trzeba ponownie wyrysować tekst, wydajność poprawia się, ponieważ system nie musi mierzyć i ponownie ułożyć tekst.
Aby można było użyć metody DrawTextLayout, należy użyć IDWriteFactory, aby utworzyć obiekty IDWriteTextFormat i IDWriteTextLayout. Po utworzeniu tych obiektów wywołaj metodę DrawTextLayout.
Aby uzyskać więcej informacji i przykładów, zobacz omówienie Formatowanie tekstu i Układ.
Tematy pokrewne