텍스트를 그리는 방법
Direct2D로 텍스트를 그리려면 단일 형식의 텍스트에 대해 ID2D1RenderTarget::D rawText 메서드를 사용합니다. 또는 여러 형식, 고급 OpenType 기능 또는 적중 테스트에 ID2D1RenderTarget::D rawTextLayout 메서드를 사용합니다. 이러한 메서드는 DirectWrite API를 사용하여 고품질 텍스트 표시를 제공합니다.
DrawText 메서드
단일 형식의 텍스트를 그리려면 DrawText 메서드를 사용합니다. 이 메서드를 사용하려면 먼저 IDWriteFactory를 사용하여 IDWriteTextFormat instance 만듭니다.
다음 코드는 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 개체는 디바이스 독립적 리소스이므로 프레임이 렌더링될 때마다 다시 만드는 대신 한 번만 만들어 애플리케이션의 성능을 향상시킬 수 있습니다.
텍스트 형식 개체를 만든 후 렌더링 대상과 함께 사용할 수 있습니다. 다음 코드는 렌더링 대상(m_pRenderTarget 변수)의 DrawText 메서드를 사용하여 텍스트를 그립니다.
// 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 메서드를 호출합니다.
자세한 내용과 예제는 텍스트 서식 및 레이아웃 개요를 참조하세요.
관련 항목