Cara Menggambar Teks
Untuk menggambar teks dengan Direct2D, gunakan metode ID2D1RenderTarget::DrawText untuk teks yang memiliki satu format. Atau, gunakan metode ID2D1RenderTarget::DrawTextLayout untuk beberapa format, fitur OpenType tingkat lanjut, atau pengujian ketepatan. Metode ini menggunakan API DirectWrite untuk menyediakan tampilan teks berkualitas tinggi.
Metode DrawText
Untuk menggambar teks yang memiliki format tunggal, gunakan metodeDrawText. Untuk menggunakan metode ini, pertama-tama gunakan IDWriteFactory untuk membuat instans IDWriteTextFormat.
Kode berikut membuat objekIDWriteTextFormatdan menyimpannya dalam variabel 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;
}
Karena IDWriteFactory dan objek IDWriteTextFormat merupakan sumber daya yang independen dari perangkat, Anda dapat meningkatkan kinerja aplikasi dengan membuatnya hanya satu kali, alih-alih membuatnya kembali setiap kali bingkai dirender.
Setelah membuat objek format teks, Anda dapat menggunakannya dengan target render. Kode berikut menggambar teks dengan menggunakan metode DrawText target render (variabel 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;
}
Metode DrawTextLayout
Metode DrawTextLayout merender objek IDWriteTextLayout. Gunakan metode ini untuk menerapkan beberapa format ke blok teks (seperti menggaris bawahi bagian teks), untuk menggunakan fitur OpenType tingkat lanjut, atau untuk melakukan dukungan pengujian hit.
MetodeDrawTextLayout juga memberikan manfaat performa untuk menggambar teks yang sama berulang kali. Objek IDWriteTextLayout mengukur dan menjabarkan teksnya saat Anda membuatnya. Jika Anda membuat objek IDWriteTextLayout hanya satu kali dan menggunakannya kembali setiap kali Anda harus menggambar ulang teks, performa meningkat karena sistem tidak perlu mengukur dan menata ulang teks.
Sebelum dapat menggunakan metodeDrawTextLayout, Anda harus menggunakanIDWriteFactoryuntuk membuat IDWriteTextFormat dan objekIDWriteTextLayout. Setelah objek ini dibuat, panggil metode DrawTextLayout.
Untuk informasi dan contoh selengkapnya, lihat gambaran umum Pemformatan Teks dan Tata Letak.
Topik terkait