본문 바로가기

DirectX/Direct2D,DirectWrite

Creating a Simple Direct2D Application

https://docs.microsoft.com/ko-kr/windows/win32/direct2d/direct2d-quickstart

 

간단한 Direct2D 응용 프로그램 만들기 - Win32 apps

Direct2D 콘텐츠를 렌더링 하는 창을 만드는 과정을 안내 합니다.

docs.microsoft.com

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/

 

Direct2D Hello World Sample - Code Samples

Draws a simple text string with Direct2D.

docs.microsoft.com

 

 

 

 

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