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

Direct2D - CreateHwndRenderTarget() 본문

DEV/Direct2D

Direct2D - CreateHwndRenderTarget()

F.R.I.D.A.Y. 2021. 4. 4. 05:01
반응형

 렌더 타겟을 생성하는 함수 CreateHwndRenderTarget


CreateHwndRenderTarget

 리소스(이미지 등)을 그릴 때 그리는 공간을 지정하는 RenderTarget을 의 핸들(HWND)를 생성하는 메서드로, Factory 객체로부터 호출이 가능하다.

 

함수 원형

HRESULT CreateHwndRenderTarget(
  const D2D1_RENDER_TARGET_PROPERTIES &      renderTargetProperties,
  const D2D1_HWND_RENDER_TARGET_PROPERTIES & hwndRenderTargetProperties,
  ID2D1HwndRenderTarget                      **hwndRenderTarget
);

 

D2D1_RENDER_TARGET_PROPERTIES

 픽셀의 색상 형식 및 알파 모드 정보, 렌더링 대상의 렌더링 형식(소프트웨어/하드웨어), 렌더링 대상의 GDI 호환여부, 하드웨어 렌더링에 필요한 Direct3D[# Direct2D는 Direct3D의 기능에서 Z축을 고정으로 만들고 제공하는 API다. 즉, Direct3D의 간소화 버전인 셈] 버전의 지정, DPI 설정을 담고 있는 구조체.

 

 여기에서 사용하는 D2D1::RenderTargetProperties()는 기본값을 반환하는 함수이다.

 

D2D1_HWND_RENDER_TARGET_PROPERTIES

 윈도우 핸들을 포함해 그리기 영역의 크기, 그리기 모드[# 즉시 그릴 것인지 다음 새로고침에서 그릴 것인지 등]를 담고 있는 구조체.

 

 세가지 중에, 윈도우 핸들과 영역의 크기만 넘겨주면 모드는 기본값이 지정되어 있어서 작성 안해도 된다.

 

ID2D1HwndRenderTarget

 함수의 결과로 생성된 HwndRenderTarget을 저장할 포인터를 주소로 넘겨준다.

 

 

생성 코드

ID2D1Factory* pFactory;
ID2D1HwndRenderTarget* pRT;

HRESULT hr = D2D1CreateFactory(D2D1_FACTROY_TYPE_SINGLE_THREADED, &pFactory);
// overload + 3

RECT rc;
GetClientRect(hwnd, &rc);

if(SUCCEEDED(hr)){
	pFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
    	D2D1::HwndRenderTargetProperties(
        	hwnd,
            D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)
            ),
		&pRT);
}

 ID2D1RenderTarget도 있고 ID2D1HwndRenderTarget도 있어서 헷갈릴 수 있다.[# 이거 못보고 코드 쓰느라 한 10분을 날려먹었다.] 작성할 때 주의하자

해석

 코드를 해석해보면 다음과 같다.

  • 먼저 팩토리 객체를 생성한다.
  • 윈도우의 클라이언트 영역을 받아온다.
  • 팩토리 객체가 성공적으로 생성되면 if 구문 내용을 진행한다

 

 if 구문의 해석은 다음과 같다.

  • 팩토리 객체의 CreateHwndRenderTarget 메서드를 이용해 pRT를 생성한다.
  • 두 번째 인자에 D2D1_HWND_RENDER_TARGET_PROPERTIES 구조체를 반환하는 함수를 작성하고, 그 인자로 윈도우 핸들과 윈도우 클라이언트 영역의 크기를 계산해 넣는다.
  • CreateHwndRenderTarget 메서드의 마지막 인자로 생성된 HwndRenderTarget 객체를 담을 포인터를 전달한다.

 

 

# index

728x90
반응형

'DEV > Direct2D' 카테고리의 다른 글

Direct2D - DrawRectangle()  (0) 2021.04.05
Direct2D - Resize()  (0) 2021.04.04
Direct2D - Clear()  (0) 2021.04.04
Direct2D - D2D1CreateFactory()  (0) 2021.04.04
Direct2D 기본 구조(Factory, RenderTarget)  (0) 2021.04.04
Comments