Direct2D 형상 드로잉 베이스
6420 단어 토대
형상은 다음과 같습니다.
드로잉을 준비하려면 다음과 같이 하십시오.
드로잉을 시작하기 전에 적어도 세 가지 항목을 준비해야 합니다.
우선 헤더 파일과 이름 공간을 도입해야 합니다.
#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;
그래도 간단해.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[파이썬 기초] 파이썬의 특수한 방법을 이해하고 코드를 읽어주세요!이번에는 파이톤의'특별한 방법'에 대한 해설을 진행한다. 나는 파이톤의 실제 업무에서 다른 사람이 쓴 코드를 자주 읽는다. 익숙하지 않으면 무엇을 하고 있는지 모르지만 시간만 지나갈 수 있다. 이런 상황을 방지하기 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.