*기하
;그릴 대상 객체의 모양 정보. 정점들의 좌표값들과 면 구성 정보.
ID2D1Geometry를 상속한 인터페이스의 객체로 표현됨.
-단순한 기하(simple geometry)
-경로 기하(path geometry)
-복합 기하(composite geometry)
*기하의 생성
;장치 독립적인 자원. ID2D1Factory의 함수를 호출하여 생성.
CreateXxxGeometry 함수 사용. Xxx 는 Rectangle, Path 등.
*기하의 렌더링
;렌더타겟의 DrawGeometry 함수나 FillGeometry 함수를 호출.
virtual void ID2D1RenderTarget::DrawGeometry(
_In_ ID2D1Geometry *geometry,
_In_ ID2D1Brush *brush,
FLOAT strokeWidth = 1.0f,
_In_opt_ ID2D1StrokeStyle *strokeStyle = NULL
);
virtual void ID2D1RenderTarget::FillGeometry(
_In_ ID2D1Geometry *geometry,
_In_ ID2D1Brush *brush,
_In_opt_ ID2D1Brush *opacityBrush = NULL
);
|
cs |
*단순한 기하(simple geometry)
ID2D1RectangleGeometry: 사각형
ID2D1RoundedRectangleGeometry: 모서리가 둥근 사각형
ID2D1EllipseGeometry: 타원 또는 원
// RectangleGeometry
ID2D1RectangleGeometry* mp_rectangle_geometry = NULL;
hr = gp_factory->CreateRectangleGeometry(
D2D1::RectF(50.0f, 50.0f, 150.0f, 150.0f), &mp_rectangle_geometry);
gp_render_target->DrawGeometry(mp_rectangle_geometry, mp_black_brush, 5);
// RoundedRectangleGeometry
ID2D1RoundedRectangleGeometry* mp_rounded_rectangle_geometry = NULL;
hr = gp_factory->CreateRoundedRectangleGeometry(
D2D1::RoundedRect(D2D1::RectF(300.0f, 50.0f, 200.0f, 150.0f), 5.0f, 5.0f), &mp_rounded_rectangle_geometry);
gp_render_target->DrawGeometry(mp_rounded_rectangle_geometry, mp_black_brush, 5);
// EllipseGeometry
ID2D1EllipseGeometry* mp_ellipse_geometry = NULL;
hr = gp_factory->CreateEllipseGeometry(
D2D1::Ellipse(D2D1::Point2F(450.0f, 100.0f), 100.0f, 50.0f), &mp_ellipse_geometry);
gp_render_target->DrawGeometry(mp_ellipse_geometry, mp_black_brush, 5);
|
cs |
*획 스타일
;CreateStrokeStyle 함수 호출.
첫 번째 인자 D2D1_STROKE_STYLE_PROPERTIES 구조체.
D2D1::StrokeStyleProperties 함수 제공.
D2D1_STROKE_STYLE_PROPERTIES StrokeStyleProperties(
D2D1_CAP_STYLE startCap = D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE endCap = D2D1_CAP_STYLE_FLAT,
D2D1_CAP_STYLE dashCap = D2D1_CAP_STYLE_FLAT,
D2D1_LINE_JOIN lineJoin = D2D1_LINE_JOIN_MITER,
FLOAT miterLimit = 10.0f,
D2D1_DASH_STYLE dashStyle = D2D1_DASH_STYLE_SOLID,
FLOAT dashOffset = 0.0f
)
// D2D1_CAP_STYLE
FLAT: 라인의 끝점에서 끝남.
SQUARE 정사격형 절반이 라인의 끝점에서 더해짐.
ROUND: 원모양 반쪽이 라인의 끝점에 더해짐.
TRIANGLE: 직각 이등변 삼각형이 라인의 끝점에 더해짐.
// D2D1_LINE_JOIN_XXX
MITER: 뾰족하기 처리.
BEBEL: 각지게 처리.
ROUND: 둥글게 처리.
MITER_OR_BEVEL: 기본은 MITER로 그리되 뾰족한 부분은 BEVEL로 그림.
// D2D1_DASH_STYLE_XXX
SOLID: 끊어짐이 없는 실선.
DASH: (대시, 공백)의 연속.
DASH_DOT: (점, 공백)의 연속.
DASH_DOT_DOT: (대시, 공백, 점, 공백)의 연속.
CUSTOM: 점선 패턴을 직접 정의.
// 실선 타원 그리기.
D2D1_ELLIPSE ellipse0 = D2D1::Ellipse(D2D1::Point2F(100.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse0, m_pTextBrush, 3);
//
D2D1_STROKE_STYLE_PROPERTIES strokeStyleProperties = D2D1::StrokeStyleProperties(
D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_TRIANGLE,
D2D1_LINE_JOIN_MITER, 10.0f,
D2D1_DASH_STYLE_DASH_DOT_DOT, 0.0f);
ID2D1StrokeStyle* mp_stroke_style = NULL;
gp_factory->CreateStrokeStyle(strokeStyleProperties, NULL, 0, &mp_stroke_style);
// 점선 타원 그리기.
D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(D2D1::Point2F(200.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse1, m_pTextBrush, 5.0f, mp_stroke_style);
// 점선 타원 그리기 후 색 채우기.
D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(D2D1::Point2F(300.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->DrawEllipse(ellipse2, m_pTextBrush, 5.0f, mp_stroke_style);
gp_render_target->FillEllipse(ellipse2, m_pOriginalShapeBrush);
// 색 채우기 후 점선 타원 그리기.
D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(D2D1::Point2F(400.0f, 100.0f), 40.0f, 30.0f);
gp_render_target->FillEllipse(ellipse3, m_pOriginalShapeBrush);
gp_render_target->DrawEllipse(ellipse3, m_pTextBrush, 5.0f, mp_stroke_style);
|
cs |
*경로 기하(path geometry)
;원호, 곡선, 직선 등의 조각들을 이어서 임의의 기하모양을 표현하는 기하 객체.
ID2D1PathGeometry 인터페이스 객체로 표현.
ID2D1Factory->CreatePathGeometry 함수를 호출하여 생성.
경로 기하 객체의 Open 함수를 호출하여 기하 싱크를 얻고 라인, 원호, 베이어 곡선, 이차 베지어 곡선의 기능을 제공.
-기하 싱크(geometry sink)
;경로 기하를 표현하는 객체.
1개 이상의 피겨(figure)로 구성. 피겨는 1개 이상의 조각(segment)로 구성.
ID2D1GeometrySink 인터페이스 객체로 표현. Open 함수를 호출하여 얻음.
-피겨 만들기
;BeginFigure() > ..AddLines, AddArc, AddBeziers, AddQuadraticBezier.. >EndFigure()
// 선분 조각들로 구성된 경로 기하를 생성.
ID2D1PathGeometry* mp_path_geometry = NULL;
gp_factory->CreatePathGeometry(&mp_path_geometry);
// 경로 기하에 조각들을 기록하기 위해서 기하 싱크를 얻음.
ID2D1GeometrySink* mp_sink = NULL;
mp_path_geometry->Open(&mp_sink);
// 피겨의 시작.(피겨의 시작점, 채우기 or 비우기)
mp_sink->BeginFigure(D2D1::Point2F(0, 0), D2D1_FIGURE_BEGIN_FILLED);
// 조각 추가.
D2D1_POINT_2F points[3] = { D2D1::Point2F(100, 0), D2D1::Point2F(200, 100), D2D1::Point2F(100, 100) };
mp_sink->AddLines(points, 3);
// 피겨의 끝.
mp_sink->EndFigure(D2D1_FIGURE_END_CLOSED);
mp_sink->Close();
// 렌더타겟에 경로 기하 그리기.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Translation(10, 10));
gp_render_target->DrawGeometry(mp_path_geometry, mp_black_brush, 2.f, 0);
|
cs |
// 선분 조각들로 구성된 경로 기하를 생성.
ID2D1PathGeometry* mp_path_geometry = NULL;
gp_factory->CreatePathGeometry(&mp_path_geometry);
// 경로 기하에 조각들을 기록하기 위해서 기하 싱크를 얻음.
ID2D1GeometrySink* mp_sink = NULL;
mp_path_geometry1->Open(&mp_sink);
// 피켜 시작 -> 끝.
mp_sink->BeginFigure(D2D1::Point2F(10, 50), D2D1_FIGURE_BEGIN_FILLED);
mp_sink->AddBezier(D2D1::BezierSegment(D2D1::Point2F(100, 0), D2D1::Point2F(200, 200), D2D1::Point2F(300, 100)));
mp_sink->AddLine(D2D1::Point2F(400, 100));
mp_sink->AddArc(D2D1::ArcSegment(D2D1::Point2F(200, 100), D2D1::SizeF(50, 50), 30.f, D2D1_SWEEP_DIRECTION_COUNTER_CLOCKWISE, D2D1_ARC_SIZE_LARGE));
mp_sink->AddBezier(D2D1::BezierSegment(D2D1::Point2F(150, 50), D2D1::Point2F(100, 150), D2D1::Point2F(0, 0)));
mp_sink->EndFigure(D2D1_FIGURE_END_CLOSED);
mp_sink->Close();
// 렌더겟에 경로 기하 그리기.
gp_render_target->SetTransform(D2D1::Matrix3x2F::Translation(10, 10));
gp_render_target->DrawGeometry(mp_path_geometry, mp_black_brush, 2.f, 0);
|
cs |
'::public > 윈도우즈 응용 프로그래밍' 카테고리의 다른 글
Direct2D - 비트맵(Bitmap) (0) | 2019.09.27 |
---|---|
Direct2D - 붓(Brush) (0) | 2019.09.27 |
Direct2D - 변환 (0) | 2019.09.26 |
Direct2D - 렌더타겟 (0) | 2019.09.26 |
Direct2D - 그림파일 읽고 출력 (0) | 2019.09.25 |