Comment dessiner du texte
Pour dessiner du texte avec Direct2D, utilisez la méthode ID2D1RenderTarget ::D rawtext pour le texte qui a un seul format. Ou utilisez la méthode ID2D1RenderTarget ::D rawtextlayout pour plusieurs formats, des fonctionnalités OpenType avancées ou un test de positionnement. ces méthodes utilisent l’API DirectWrite pour fournir un affichage de texte de haute qualité.
Méthode DrawText
Pour dessiner du texte avec un seul format, utilisez la méthode DrawText . Pour utiliser cette méthode, utilisez d’abord un IDWriteFactory pour créer une instance IDWriteTextFormat .
Le code suivant crée un objet IDWriteTextFormat et le stocke dans la variable 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;
}
Étant donné que les objets IDWriteFactory et IDWriteTextFormat sont des ressources indépendantes du périphérique, vous pouvez améliorer les performances d’une application en les créant une seule fois, au lieu de les recréer chaque fois qu’un frame est rendu.
Après avoir créé l’objet de format de texte, vous pouvez l’utiliser avec une cible de rendu. Le code suivant dessine le texte à l’aide de la méthode DrawText de la cible de rendu (la variable 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;
}
Méthode DrawTextLayout
La méthode DrawTextLayout restitue un objet IDWriteTextLayout . Utilisez cette méthode pour appliquer plusieurs formats à un bloc de texte (par exemple, en soulignant une partie du texte), pour utiliser des fonctionnalités OpenType avancées ou pour effectuer une prise en charge du test de positionnement.
La méthode DrawTextLayout offre également des avantages en matière de performances pour dessiner le même texte à plusieurs reprises. L’objet IDWriteTextLayout mesure et dispose son texte lorsque vous le créez. Si vous créez un objet IDWriteTextLayout une seule fois et que vous le réutilisez chaque fois que vous devez redessiner le texte, les performances s’améliorent, car le système n’a pas à mesurer et à disposer à nouveau le texte.
Avant de pouvoir utiliser la méthode DrawTextLayout , vous devez utiliser un IDWriteFactory pour créer des objets IDWriteTextFormat et IDWriteTextLayout . Une fois ces objets créés, appelez la méthode DrawTextLayout .
Pour plus d’informations et d’exemples, consultez la vue d’ensemble de la mise en forme et de la disposition du texte .