일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 배열
- 프로그래밍
- Kotlin
- Desktop
- Direct2D
- 이지스퍼블리싱
- 티스토리
- c
- 김성엽
- 연산자
- Programming
- Tips강좌
- Visual Studio
- 함수
- c#
- 알고리즘
- c++
- 리뷰
- VS ERROR
- Win32
- 포인터
- doit코틀린프로그래밍
- CS
- tipssoft
- 문법
- 지식나눔강좌
- 백준
- Javascript
- Windows
- Tips프로그래밍강좌
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
DirectWrite - 텍스트 출력하기 2 본문
텍스트 출력하기 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
'DEV > Direct2D' 카테고리의 다른 글
DirectWrite - IDWriteFactory (0) | 2021.04.21 |
---|---|
DirectWrite - DirectWrite 되짚기 (0) | 2021.04.14 |
DirectWrite - 텍스트 출력하기 1 (2) | 2021.04.10 |
Direct2D - 텍스트 출력하기 Intro. (0) | 2021.04.10 |
Direct2D에서 MessageBox가 나오지 않는 문제 (0) | 2021.04.08 |