F.R.I.D.A.Y.

DirectWrite - 텍스트 출력하기 2 본문

DEV/Direct2D

DirectWrite - 텍스트 출력하기 2

F.R.I.D.A.Y. 2021. 4. 13. 00:13
반응형

 텍스트 출력하기 1에서 구성한 코드를 기반으로 이제 출력하는 코드를 작성합니다.


OnPaint 구성

 이제 DirectWrite를 사용하기 위해 OnPaint 메서드를 구성하겠습니다. OnPaint 메서드를 구성하고 난 뒤, HandleMessage 메서드에 WM_PAINT와 OnPaint 메서드를 바인딩합니다.

//mainWin.h - MainWindow

private:
	LRESULT OnCreate();
	LRESULT OnPaint();
// mainWin.cpp
LRESULT MainWindow::OnPaint()
{

	return 0;
}
// mainWin.cpp - HandleMessage
	switch (uMsg) {
		case WM_CREATE:
			{
				return OnCreate();
			}
		case WM_PAINT:
			{
				return OnPaint();
			}
	}

 

OnPaint 작성

 ID2D1HwndRenderTarget의 DrawText 메서드를 이용할 것입니다. DrawText 메서드는 아래의 원형을 가지고 있습니다.

void DrawText(
  const WCHAR            *string,
  UINT32                 stringLength,
  IDWriteTextFormat      *textFormat,
  const D2D1_RECT_F &    layoutRect,
  ID2D1Brush             *defaultFillBrush,
  D2D1_DRAW_TEXT_OPTIONS options,
  DWRITE_MEASURING_MODE  measuringMode
);

 첫 번째 인자와 두 번째 인자는 출력할 텍스트와 그 길이, 세 번째 인자는 텍스트 포맷, 네 번째는 텍스트를 출력할 공간, 다섯 번째는 출력에 사용할 브러시, 여섯 번쨰는 텍스트 출력 옵션, 일곱 째는 텍스트의 단위를 무엇으로 할 것인가라 생각하면 됩니다.

 

먼저, Direct2D로 그릴 것을 알리기 위해 BeginPaint, EndPaint 메서드를 작성합니다.

LRESULT OnPaint(){
	pRT->BeginPaint();
    
    
    
	return pRT->EndPaint();
}

 

 우리가 필요한 정보는 다음과 같습니다.

  • 출력할 문자열
  • 문자열의 길이
  • 출력할 영역의 크기

 나머지는 구성되어 있으니 위 세 개만 만들면 됩니다. 먼저 문자열과 그 길이를 작성하겠습니다.

const wchar_t* str = L"Hello world";
unsigned int length = wcslen(str);
더보기

# 왜 wchar_t 타입이 작성되어 있나요?

 현재 유니코드를 지원하는 프로그램을 기준으로 작성되고 있기 때문입니다. 만일 유니코드가 아니라 ANSI 기반의 프로그램을 구성하고 있다면 아래처럼 작성하면 됩니다.

const char* str = "Hello world";
unsigned int length = strlen(str);

 

 그 다음으로 그리기를 할 영역을 구하겠습니다. 윈도우 클라이언트 영역의 중심에 나오도록 할 것이므로 클라이언트 영역의 크기를 구하면 되겠습니다.

D2D1_SIZE_U size = pRT->GetSize();

D2D1_RECT_F layoutRect = D2D1::RectF(
	0, 0, size.width, size.height);

 

 이제 구성된 정보를 바탕으로 텍스트를 출력합니다.

pRT->DrawTextW(str, length, pWFormat, layoutRect, pBrush);

출력된 모습

 만일 프로그램이 검정 바탕으로 이뤄졌다면 Clear 메서드를 이용해 처리할 수 있습니다.

 

최종 코드

 OnPaint 메서드의 최종 코드는 다음과 같습니다.

LRESULT MainWindow::OnPaint()
{
	pRT->BeginDraw();
	D2D1_SIZE_F size = pRT->GetSize();

	pRT->Clear(D2D1::ColorF(1.0,1.0,1.0));

	D2D1_RECT_F layoutRect = D2D1::RectF(
		0,0,size.width, size.height
	);

	const wchar_t* str = L"Hello world";
	unsigned int length = wcslen(str);

	pRT->DrawTextW(
		str, length, pWFormat, layoutRect, pBrush
	);

	return pRT->EndDraw();
}

 

# index

728x90
반응형
Comments