https://docs.microsoft.com/ko-kr/windows/win32/direct2d/direct2d-quickstart
VisualStudio 2019로는 빌드가 안되고 2013으로만로 빌드되던 문제
{
syntax error: identifier 'FILE_INFO_BY_HANDLE_CLASS'
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\fileapi.h
syntax error: identifier 'FILE_INFO_BY_HANDLE_CLASS'
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\winbase.h
VisualStudio 2019로 빌드하려면 Configuration Properties > Platform Toolset
Visual Studio 2013 (v120)으로 변경하고 빌드해야 한다.
//헤더파일의 이 부분이 문제가 되어 발생
#ifndef WINVER
#define WINVER 0x0700
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0700
#endif
}
Creating a Simple Direct2D Application의 설명 순서대로 Direct2D Hello World Sample을 수정하여 실행
https://docs.microsoft.com/en-us/samples/microsoft/windows-classic-samples/direct2dhelloworld/
Part 1: Create the DemoApp Header
- 클래스 초기화, 리소스 생성 및 삭제, 메시지 루프 처리, 렌더링, Windows 프로시저를 위한 메서드를 선언
Part 2: Implement the Class Infrastructure
- 생성자 및 소멸자, 초기화 및 메시지 루핑 메서드, WinMain 함수를 구현
- Win32 응용 프로그램과 다른 점은 Direct2D 리소스를 만드는 CreateDeviceIndependentResources 메서드를 호출하는 Initialize 메서드
2.1
- 생성자는 멤버를 NULL로 초기화해야 한다
- 소멸자는 멤버로 저장된 모든 인터페이스를 SafeRelease로 해제.
2.2
- 메시지를 번역하고 전달하는 RunMessageLoop 메서드 구현
2.3
- CreateDeviceIndependentResources 메서드를 호출하는 Initialize 메서드를 구현
2.4
- 응용 프로그램 진입 점 역할을하는 WinMain 메서드를 만든다.
- WinMain에서는 클래스의 인스턴스를 초기화하고 메시지 루프를 시작한다.
Part 3: Create Direct2D Resources
- device-independent resources 와 device-dependent resources 두 가지 유형 제공
- device-dependent resources는 특정 렌더링 장치와 연결되어 있으며 해당 장치가 제거되면 작동 중지
3.1
- CreateDeviceIndependentResources 메서드 구현
- 메서드에서 다른 Direct2D 리소스를 만들기 위해 장치 독립적인 리소스 인 ID2D1Factory 를 만든다.
3.2
- CreateDeviceResources 메서드를 구현
- 윈도우의 장치 종속 리소스를 생성한다.
- 렌더타겟을 생성, 브러시 생성
- ID2D1HwndRenderTarget는 윈도우 창과 동일한 크기로 생성되게 설정
3.3
- 렌더 타겟을 이용하여 두 색을 표현하기 위해 두 개의 ID2D1SolidColorBrush 생성
3.4
- CreateDeviceResources 메서드는 반복적으로 호출되므로 렌더링 대상이 이미 존재하는지 확인하는 if문 필요하다.
3.5
- DiscardDeviceResources 메서드를 구현.
- CreateDeviceResources 메서드에서 만든 ID2D1SolidColorBrush를 해제
Part 4: Render Direct2D Content
- Windows 프로 시저 구현
- 콘텐츠를 그리는 OnRender 메서드 구현
- 창 크기를 조정할 때 렌더링 대상의 크기를 조정하는 OnResize 메서드 구현
4.1
- 창 메시지를 처리하려면 WndProc 메서드를 구현
- ex) WM_SIZE 메시지는 OnResize 메서드를 호출하여 새로운 너비와 높이 전달
- ex) WM_PAINT 메시지는 OnRender 메서드를 호출하여 그린다.
4.2
- OnRender 메서드를 구현
- 먼저 HRESULT를 만든다. (함수 상태 정보)
- 창이 그려질 때마다 호출되기 때문에 이미 렌더링 대상이 존재할 경우 작업 수행되지 못하도록 if 문 추가
4.3
- CreateDeviceResource 메서드가 성공했는지 HRESULT를 통해 파악하여 수행할지 여부 결정
4.4
- BeginDraw 메서드 : 그리기 시작
- SetTransform 메서드 : 변환을 단위 행렬로 설정
- Clear 메서드 : 창 지우기
4.5
- GetSize 메서드 : 도면 영역의 크기를 검색, D2D1_SIZE_F 반환
4.6
- for 루프와 렌더링 대상의 DrawLine 메서드를 사용하여 일련의 선을 그리는 방법으로 그리드 배경을 그린다.
4.7
- 화면 중앙에 두 개의 직사각형 원형을 만든다.
4.8
- FillRectangle 메서드 : 사각형 내부를 선택한 브러시로 칠한다.
4.9
- DrawRectangle 메서드 : 사각형 윤곽선을 선택한 브러시로 그린다.
4.10
- EndDraw 메서드 : 렌더링이 종료되고 HRESULT를 반환하여 성공여부 표시
4.11
- EndDraw 메서드가 반환한 HRESULT를 확인하여 D2DERR_RECREATE_TARGET 상태라면 DiscardDeviceResources 메서드를 호출하여 해제.
- 리소스는 WM_PAINT 또는 WM_DISPLAYCHANGE 메시지를 받을 때 다시 생성
4.12
- HRESULT를 반환하고 OnRender 메서드를 닫는다.
4.13
- OnResize 메서드를 구현하여 렌더링 대상의 크기를 창의 새 크기로 조정
'DirectX > Direct2D,DirectWrite' 카테고리의 다른 글
Direct2D Resources Overview (0) | 2021.04.30 |
---|---|
Text Rendering with Direct2D and DirectWrite (0) | 2021.04.30 |
Tutorial: Getting Started with DirectWrite (0) | 2021.04.23 |
Direct2D Hello World Sample (0) | 2021.04.22 |
Direct2D 학습 목표 (0) | 2021.04.22 |