Direct2D 형상 드로잉 베이스

6420 단어 토대
앞서 말했듯이 D2D는 주로 세 가지 유형의 데이터를 그리기 위해 기하학적 도형, 그림, 문자를 그린다.이 몇 가지 대상을 자원이라고도 하는데 자원은 D2D 유수선에서 가공될 대상이다.
형상은 다음과 같습니다.
 
  • 단순 형상
  • 선, DrawLine, 시작점과 끝점으로 구성되며, 점용 구조체: D2D1POINT_2F 설명.
  • 직사각형, ID2D1RectangleGeometry, DrawRectangle, 네 변의 거리로 표시되며 구조체: D2D1RECT_F 설명.
  • 원각 사각형, ID2D1RoundedRectangleGeometry, DrawRoundedRectangle, 동사각형, 구조체 사용: D2D1ROUNDED_RECT 설명 및 필렛 매개변수도 포함됩니다.
  • 타원, ID2D1 Ellipse Geometry, DrawEllipse 포함, 구조체: D2D1ELLIPSE 설명.

  • 경로, ID2D1PathGeometry
  • 조합 그래픽,
  • 형상 조합, ID2D1Geometry Group
  • 변형 기하학 도형, ID2D1TransformedGeometry

  • 드로잉을 준비하려면 다음과 같이 하십시오.
    드로잉을 시작하기 전에 적어도 세 가지 항목을 준비해야 합니다.
  • D2D 팩토리 개체, ID2D1Factory 커넥터.CreateHwndRenderTarget 방법을 사용하여 드로잉 대상을 작성할 수 있습니다.
  • 렌더링 창, ID2D1HwndRenderTarget 인터페이스.Win32 프로그램이라면 기본 HWND 창이고, 상점 응용 프로그램이라면 표면을 그리는 컨트롤입니다.렌더링 창은 기하학적 도형, 문자, 그림도 그리는 것을 책임진다.
  • 브러시, ID2D1 SolidColorBrush 커넥터.형상을 그릴 때 도면의 스타일을 지정합니다.
  • 그리기 영역입니다. win32 프로그램이라면 렌더링 창에서 그릴 영역을 지정해야 합니다.

  • 우선 헤더 파일과 이름 공간을 도입해야 합니다.
    #include "windows.h"
    
    #include "D2D1.h"
    
    
    
    using namespace D2D1;

    링크할 Lib을 추가하는 것을 잊지 마십시오. input lib은 다음과 같습니다.
    d2d1.lib;
    dxgi.lib;
    dwrite.lib;
    dxguid.lib;
    windowscodecs.lib;
    다음 네 객체에 대한 코드를 선언합니다.
    	// Direct2D factory
    
    	ID2D1Factory* pD2DFactory; 
    
    	// Render target
    
    	ID2D1HwndRenderTarget* pRenderTarget;
    
    	// A black brush, reflect the line color
    
    	ID2D1SolidColorBrush* pBlackBrush; 
    
    	// Render area
    
    	RECT rc ; 
    이러한 값을 초기화하는 코드는 다음과 같습니다.
    	//create d2d factory
    
    	hr =  D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;
    
    	//create render target (hwnd window)
    
    	GetClientRect(hWnd, &rc);
    
    	hr = pD2DFactory->CreateHwndRenderTarget( RenderTargetProperties(), HwndRenderTargetProperties(hWnd, SizeU(rc.right - rc.left, rc.bottom - rc.top)), &pRenderTarget);
    
    	//create brush
    
    	hr = pRenderTarget->CreateSolidColorBrush(ColorF(ColorF::Blue), &pBlackBrush);

    그리기 시작할 수 있습니다.필자가 사용한 프로그램은 win32 프로그램으로, 그려진 코드는 모두 WndProc 리셋 함수의case WM 에 써야 한다PAINT: 그 다음에 모든 그리기 코드를 pRenderTarget->Begindraw () 에 포함합니다.및 pRenderTarget->EndDraw();사이예를 들면 다음과 같습니다.
    	pRenderTarget->BeginDraw();
    
    
    
    	//clear screen
    
    	pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
    
    
    
    	//draw line with 2 points
    
    	D2D1_POINT_2F ptStart = Point2F(0,0);
    
    	D2D1_POINT_2F ptEnd = Point2F(100,100);
    
    	pRenderTarget->DrawLine(ptStart,ptEnd,pBlackBrush);
    
    	
    
    	//draw rectangle
    
    	D2D1_RECT_F rect  = RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f);
    
    	pRenderTarget->DrawRectangle(rect, pBlackBrush);
    
    
    
    	//draw round rect
    
    	D2D1_ROUNDED_RECT roundrect  = RoundedRect(RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f), 30.0f, 50.0f);
    
    	pRenderTarget->DrawRoundedRectangle(roundrect, pBlackBrush, 1.0f);
    
    
    
    	pRenderTarget->EndDraw();

    WM_PAINT는 창을 다시 그려야 할 때 시스템에서 호출하기 때문에 주동적으로 호출하지 않아도 끊임없이 새로 고쳐집니다.
    당연하지, 코드를 WM에 쌓아두고PAINT 이후에는 너무 SB이기 때문에 클래스를 직접 봉인하는 것이 좋습니다. 다음과 같습니다.
    헤더 파일은 다음과 같습니다.
    #pragma once
    
    
    
    #include "stdafx.h"
    
    #include "windows.h"
    
    #include "D2D1.h"
    
    
    
    using namespace D2D1;
    
    
    
    class D2DRender
    
    {
    
    public:
    
    	D2DRender(void);
    
    	~D2DRender(void);
    
    	
    
    	HRESULT CreateDeviceIndependentResources();
    
    	HRESULT CreateDeviceResources(HWND hWnd);
    
    	void OnRender();
    
    	void DiscardDeviceResources();
    
    	void OnResize(UINT width, UINT height);
    
    
    
    private:
    
    	// Direct2D factory
    
    	ID2D1Factory* pD2DFactory; 
    
    	// Render target
    
    	ID2D1HwndRenderTarget* pRenderTarget;
    
    	// A black brush, reflect the line color
    
    	ID2D1SolidColorBrush* pBlackBrush; 
    
    	// Render area
    
    	RECT rc ; 
    
    	//result
    
    	HRESULT hr;
    
    };
    
    
    구현은 다음과 같습니다.
    #include "stdafx.h"
    
    #include "D2DRender.h"
    
    
    
    D2DRender::D2DRender()
    
    {
    
    	// Direct2D factory
    
    	pD2DFactory = NULL; 
    
    	// Render target
    
    	pRenderTarget = NULL;
    
    	// A black brush, reflect the line color
    
    	pBlackBrush = NULL; 	
    
    }
    
    
    
    D2DRender::~D2DRender()
    
    {
    
    	pD2DFactory->Release();
    
    	pRenderTarget->Release();
    
    	pBlackBrush->Release();
    
    
    
    }
    
    
    
    void D2DRender::DiscardDeviceResources()
    
    {
    
    	pD2DFactory->Release();
    
    	pRenderTarget->Release();
    
    	pBlackBrush->Release();
    
    }
    
    
    
    
    
    void D2DRender::OnResize(UINT width, UINT height)
    
    {
    
    	if(pRenderTarget)
    
    	{
    
    		pRenderTarget->Resize(SizeU(width,height));
    
    	}
    
    }
    
    
    
    HRESULT D2DRender::CreateDeviceIndependentResources()
    
    {
    
    	//create d2d factory
    
    	hr =  D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory) ;
    
    
    
    	return hr;
    
    }
    
    
    
    HRESULT D2DRender::CreateDeviceResources(HWND hWnd)
    
    {
    
    	//create render target (hwnd window)
    
    	GetClientRect(hWnd, &rc);
    
    	hr = pD2DFactory->CreateHwndRenderTarget( RenderTargetProperties(), HwndRenderTargetProperties(hWnd, SizeU(rc.right - rc.left, rc.bottom - rc.top)), &pRenderTarget);
    
    
    
    	//create brush
    
    	hr = pRenderTarget->CreateSolidColorBrush(ColorF(ColorF::Blue), &pBlackBrush);
    
    
    
    	return hr;
    
    }
    
    
    
    void D2DRender::OnRender()
    
    {
    
    	pRenderTarget->BeginDraw();
    
    
    
    	//clear screen
    
    	pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
    
    
    
    	//draw line with 2 points
    
    	D2D1_POINT_2F ptStart = Point2F(0,0);
    
    	D2D1_POINT_2F ptEnd = Point2F(100,100);
    
    	pRenderTarget->DrawLine(ptStart,ptEnd,pBlackBrush);
    
    	
    
    	//draw rectangle
    
    	D2D1_RECT_F rect  = RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f);
    
    	pRenderTarget->DrawRectangle(rect, pBlackBrush);
    
    
    
    	//draw round rect
    
    	D2D1_ROUNDED_RECT roundrect  = RoundedRect(RectF(rc.left + 100.0f, rc.top + 100.0f, rc.right - 100.0f, rc.bottom - 100.0f), 30.0f, 50.0f);
    
    	pRenderTarget->DrawRoundedRectangle(roundrect, pBlackBrush, 1.0f);
    
    
    
    	pRenderTarget->EndDraw();
    
    }
    
    
    
    
    
    
    
    

    그리고 WM에서...PANIT에서 호출합니다. 기본적으로 생성된 gdi 그리기에 사용된 hdc 관련 코드를 삭제할 수 있습니다.
    	case WM_PAINT:
    
    		//hdc = BeginPaint(hWnd, &ps);
    
    		D2DRender pRender;
    
    		pRender.CreateDeviceIndependentResources();
    
    		pRender.CreateDeviceResources(hWnd);
    
    		pRender.OnRender();
    
    		//EndPaint(hWnd, &ps);
    
    		break;

    그래도 간단해.
     

    좋은 웹페이지 즐겨찾기