From 38cf0aff67d611af00678c3e7057dbcddfd20373 Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 12:30:16 +0900 Subject: [PATCH 01/11] Test branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 원 / 직사각형 그리기 (CRect 기반 리스트 구현) --- ChildView.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++----- ChildView.h | 8 +++++++- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index 2e3f841..2d97331 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -245,16 +245,27 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { dc->TextOut(10, 70, _T("Keyboard: ") + CString(std::to_string(m_keyboard).c_str())); // 튀기는 공 그리기 - Circle(dc, m_ball_pos, m_ball_radius, RGB(0, 255, 255)); + //Circle(dc, m_ball_pos, m_ball_radius, RGB(0, 255, 255)); // 고무 벽 그리기 - Rectangle(dc, m_wall_rect, RGB(255, 255, 0)); + //Rectangle(dc, m_wall_rect, RGB(255, 255, 0)); // 직선 그리기 - Line(dc, {100, 100}, {200, 300}); + //Line(dc, {100, 100}, {200, 300}); // 폴리곤 그리기 - Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); + //Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); + + // 직사각형들 그리기 + for (auto x : m_rects) + Rectangle(dc, x, RGB(255, 255, 0)); + + // 원들 그리기 + for (auto x : m_circles) { + int rad = abs(x.left - x.right) / 2; + CPoint center{ x.left + rad, x.top + rad }; + Circle(dc, center, rad, RGB(255, 255, 255)); + } } void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) @@ -336,8 +347,33 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_wall_rect.bottom = p.y + h / 2; }); + + // 마우스 드래그 이벤트 리스너 + m_mouse_event_listeners.Add(kMouseDrag, [this](auto, auto p) { + switch (m_toolbar_mode) { + case kToolbarDrawRectangle: + m_rects.back().right = p.x; + m_rects.back().bottom = p.y; + break; + case kToolbarDrawCircle: + m_circles.back().right = p.x; + m_circles.back().bottom = p.y; + break; + } + + }); // 마우스 클릭 이벤트 리스너 - m_mouse_event_listeners.Add(kMouseLButtonDown, [this](auto, auto p) { m_mouse_event = "LButtonDown"; }); + m_mouse_event_listeners.Add(kMouseLButtonDown, [this](auto, auto p) { + m_mouse_event = "LButtonDown"; + switch (m_toolbar_mode) { + case kToolbarDrawRectangle: + m_rects.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); + break; + case kToolbarDrawCircle: + m_circles.push_back(CRect{ CPoint{p.x, p.y},CSize{0,0} }); + break; + } + }); m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { m_mouse_event = "LButtonUp"; }); m_mouse_event_listeners.Add(kMouseLButtonDblClk, [this](auto, auto p) { m_mouse_event = "LButtonDblClk"; }); @@ -359,6 +395,9 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) void CChildView::OnMouseMove(UINT nFlags, CPoint point) { m_mouse_event_listeners(kMouseMove, nFlags, point); + if ((nFlags & MK_LBUTTON) == MK_LBUTTON) + m_mouse_event_listeners(kMouseDrag, nFlags, point); + CWnd::Invalidate(); CWnd::OnMouseMove(nFlags, point); } diff --git a/ChildView.h b/ChildView.h index 9dd46a7..117a3c3 100644 --- a/ChildView.h +++ b/ChildView.h @@ -47,6 +47,12 @@ class CChildView : public CWnd // 고무벽 정보 CRect m_wall_rect{CPoint{}, CSize{20, 200}}; + // 직사각형 리스트 + std::list m_rects; + + + // 원 벡터 + std::list m_circles; void CalculateBall(); public: @@ -77,7 +83,7 @@ class CChildView : public CWnd enum MouseEvent { kMouseMove, - + kMouseDrag, kMouseLButtonDown, kMouseLButtonUp, kMouseLButtonDblClk, From 4d7590bb9f61d6ec62e29a9115de9c5523ff962e Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 14:56:32 +0900 Subject: [PATCH 02/11] Add Shape Class --- ChildView.cpp | 34 ++++++++------ ChildView.h | 10 ++-- MenuAndControls.vcxproj | 1 + MenuAndControls.vcxproj.filters | 6 +++ Shape.h | 82 +++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 Shape.h diff --git a/ChildView.cpp b/ChildView.cpp index 2d97331..18e494c 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -256,15 +256,14 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { // 폴리곤 그리기 //Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); - // 직사각형들 그리기 - for (auto x : m_rects) - Rectangle(dc, x, RGB(255, 255, 0)); - - // 원들 그리기 - for (auto x : m_circles) { - int rad = abs(x.left - x.right) / 2; - CPoint center{ x.left + rad, x.top + rad }; - Circle(dc, center, rad, RGB(255, 255, 255)); + for (auto x : m_shapes) { + if(dynamic_cast(x)) + Rectangle(dc, CRect{ x->p1_, x->p2_ }, RGB(255, 255, 0), 0); + else if (dynamic_cast(x)) { + int rad = abs(x->p1_.x - x->p2_.x) / 2; + CPoint center{ (x->p1_.x + x->p2_.x) / 2, (x->p1_.y + x->p2_.y) / 2 }; + Circle(dc, center, rad, RGB(255, 255, 255)); + } } } @@ -352,12 +351,14 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_mouse_event_listeners.Add(kMouseDrag, [this](auto, auto p) { switch (m_toolbar_mode) { case kToolbarDrawRectangle: - m_rects.back().right = p.x; - m_rects.back().bottom = p.y; + /*m_rects.back().right = p.x; + m_rects.back().bottom = p.y;*/ + m_shapes.back()->p2_ = p; break; case kToolbarDrawCircle: - m_circles.back().right = p.x; - m_circles.back().bottom = p.y; + /*m_circles.back().right = p.x; + m_circles.back().bottom = p.y;*/ + m_shapes.back()->p2_ = p; break; } @@ -367,10 +368,13 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_mouse_event = "LButtonDown"; switch (m_toolbar_mode) { case kToolbarDrawRectangle: - m_rects.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); + //m_rects.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); + m_shapes.push_back(new CRectangle(CPoint{ p.x, p.y }, CPoint{p.x, p.y})); + //m_shapes.push_back(std::make_shared(CPoint{ p.x, p.y })); break; case kToolbarDrawCircle: - m_circles.push_back(CRect{ CPoint{p.x, p.y},CSize{0,0} }); + //m_circles.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); + m_shapes.push_back(new CCircle(CPoint{ p.x, p.y }, CPoint{ p.x, p.y })); break; } }); diff --git a/ChildView.h b/ChildView.h index 117a3c3..7269e0e 100644 --- a/ChildView.h +++ b/ChildView.h @@ -12,6 +12,7 @@ #include #include "EventListener.h" +#include "Shape.h" // CChildView 창 @@ -48,11 +49,14 @@ class CChildView : public CWnd CRect m_wall_rect{CPoint{}, CSize{20, 200}}; // 직사각형 리스트 - std::list m_rects; + //std::list m_rects; + // 도형 리스트 + std::list m_shapes; - // 원 벡터 - std::list m_circles; + + // 원 리스트 + //std::list m_circles; void CalculateBall(); public: diff --git a/MenuAndControls.vcxproj b/MenuAndControls.vcxproj index 18f92bc..aa2e449 100644 --- a/MenuAndControls.vcxproj +++ b/MenuAndControls.vcxproj @@ -190,6 +190,7 @@ + diff --git a/MenuAndControls.vcxproj.filters b/MenuAndControls.vcxproj.filters index 3ce1842..5825c5d 100644 --- a/MenuAndControls.vcxproj.filters +++ b/MenuAndControls.vcxproj.filters @@ -36,6 +36,12 @@ 헤더 파일 + + 헤더 파일 + + + 헤더 파일 + diff --git a/Shape.h b/Shape.h new file mode 100644 index 0000000..7c1ea5a --- /dev/null +++ b/Shape.h @@ -0,0 +1,82 @@ +#pragma once +#include + +class CShape { +public: + CShape(CPoint p1 = CPoint{ 0,0 }, CPoint p2 = CPoint{ 0,0 }, bool selected = false) : p1_(p1), p2_(p2), selected_(selected) {} + CShape(const CShape& r) : p1_(r.p1_), p2_(r.p2_), selected_(r.selected_) {} + CShape(CShape&& r) noexcept : p1_(r.p1_), p2_(r.p2_), selected_(r.selected_) {} + CShape& operator=(const CShape& r) { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } + CShape& operator=(CShape&& r) noexcept { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } + virtual ~CShape() {} +public: + CPoint p1_; + CPoint p2_; + bool selected_; +}; + +class CRectangle : public CShape { +public: + CRectangle(CPoint p1 = CPoint{ 0,0 }, CPoint p2= CPoint{0,0}, bool selected = false) : CShape(p1, p2, selected) { + + } + CRectangle(const CRectangle& r) : CShape(r.p1_, r.p2_, r.selected_) {} + CRectangle(CRectangle&& r) noexcept : CShape(r.p1_, r.p2_, r.selected_) {} + CRectangle& operator=(const CRectangle& r) { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } + CRectangle& operator=(CRectangle&& r) noexcept { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } +}; + +class CCircle : public CShape { +public: + CCircle(CPoint p1 = CPoint{ 0,0 }, CPoint p2 = CPoint{ 0,0 }, bool selected=false) : CShape(p1, p2, selected) { + + } + CCircle(const CCircle& r) : CShape(r.p1_, r.p2_, r.selected_) {} + CCircle(CCircle&& r) noexcept : CShape(r.p1_, r.p2_, r.selected_) {} + CCircle& operator=(const CCircle& r) { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } + CCircle& operator=(CCircle&& r) noexcept { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } +}; + + +class CLine : public CShape { +public: + CLine(CPoint p1 = CPoint{ 0,0 }, CPoint p2 = CPoint{ 0,0 }, bool selected=false) : CShape(p1, p2, selected) { + + } + CLine(const CLine& r) : CShape(r.p1_, r.p2_, r.selected_) {} + CLine(CLine&& r) noexcept : CShape(r.p1_, r.p2_, r.selected_) {} + CLine& operator=(const CLine& r) { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } + CLine& operator=(CLine&& r) noexcept { + p1_ = r.p1_; + p2_ = r.p1_; + selected_ = r.selected_; + } +}; \ No newline at end of file From 55ee4ab382440cf5d3ca47224aa97edac6f039eb Mon Sep 17 00:00:00 2001 From: Dongjin Sun Date: Tue, 19 Dec 2023 15:05:43 +0900 Subject: [PATCH 03/11] DELETE --- ChildView.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ChildView.cpp b/ChildView.cpp index 2d97331..ea2c73e 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -501,7 +501,15 @@ void CChildView::OnUpdateDrawCurve(CCmdUI* pCmdUI) { } void CChildView::OnRemoveSelected() { - // TODO: 여기에 명령 처리기 코드를 추가합니다. + std::list::iterator iter = m_shapes.begin(); + while (iter != m_shapes.end()) { + if (*iter->selected_ == true) { + iter = m_shapes.erase(iter); + } + else { + iter++; + } + } } From 89493bbae24606dd3d0e8d0eba940e70a1a72b81 Mon Sep 17 00:00:00 2001 From: yejin <98yejin22@gmail.com> Date: Tue, 19 Dec 2023 15:12:14 +0900 Subject: [PATCH 04/11] Add Select Area Add Select Area --- ChildView.cpp | 28 ++++++++++++++++++++++++++++ ChildView.h | 20 ++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/ChildView.cpp b/ChildView.cpp index 18e494c..a1bf05f 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -188,6 +188,9 @@ BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_UPDATE_COMMAND_UI(ID_DRAW_CURVE, &CChildView::OnUpdateDrawCurve) ON_WM_KEYDOWN() ON_WM_ERASEBKGND() + + // Add command, Resource.h에 커맨드 추가해야함! + // ON_COMMAND(ID_SELECT_AREA, &CChildView::OnSelectArea) END_MESSAGE_MAP() @@ -265,6 +268,11 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { Circle(dc, center, rad, RGB(255, 255, 255)); } } + + // 선택 영역 직사각형 표기 + CRect Area(TOP_LEFT, BOTTOM_RIGHT); + + Rectangle(dc, Area, RGB(255, 255, 255)); } void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) @@ -378,6 +386,7 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) break; } }); + m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { m_mouse_event = "LButtonUp"; }); m_mouse_event_listeners.Add(kMouseLButtonDblClk, [this](auto, auto p) { m_mouse_event = "LButtonDblClk"; }); @@ -394,6 +403,25 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) // ESC 시 그리기 모드 취소 m_keyboard_listeners.Add(VK_ESCAPE, [this](...) { m_toolbar_mode = kToolbarNone; }); + // 영역 선택 마우스 이벤트 -> 다운 + m_mouse_event_listeners.Add(kMouseLButtonDown, [this](auto, auto p) { + if (m_toolbar_mode == kToolbarSelectArea) { // 툴바에서 영역 선택 버튼을 눌렀을 경우 + TOP_LEFT = p; + } + }); + // 영역 선택 마우스 이벤트 -> 드래그 + m_mouse_event_listeners.Add(kMouseDrag, [this](auto, auto p) { + if (m_toolbar_mode == kToolbarSelectArea) { // 툴바에서 영역 선택 버튼을 눌렀을 경우 + BOTTOM_RIGHT = p; + } + }); + // 영역 선택 마우스 이벤트 -> 업 + m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { + if (m_toolbar_mode == kToolbarSelectArea) { // 툴바에서 영역 선택 버튼을 눌렀을 경우 + BOTTOM_RIGHT = p; + } + }); + return 0; } diff --git a/ChildView.h b/ChildView.h index 7269e0e..64a46ab 100644 --- a/ChildView.h +++ b/ChildView.h @@ -50,15 +50,35 @@ class CChildView : public CWnd // 직사각형 리스트 //std::list m_rects; +<<<<<<< Updated upstream // 도형 리스트 std::list m_shapes; +======= +>>>>>>> Stashed changes + // 도형 리스트 + std::list m_shapes; + +<<<<<<< Updated upstream + // 원 리스트 + //std::list m_circles; +======= +<<<<<<< HEAD + // 원 벡터 + std::list m_circles; +======= // 원 리스트 //std::list m_circles; +>>>>>>> 3f8f7a648268bceffa683ba6322bd09e52b9c7a6 +>>>>>>> Stashed changes void CalculateBall(); + // 영역 선택 변수들 + CPoint TOP_LEFT; + CPoint BOTTOM_RIGHT; + public: protected: From f214e96c3d191c864fd5f69b3279d61da552fb92 Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 15:17:25 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=EC=B6=A9=EB=8F=8C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChildView.cpp | 4 ++-- ChildView.h | 22 +--------------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index 69804a2..96c558e 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -533,9 +533,9 @@ void CChildView::OnUpdateDrawCurve(CCmdUI* pCmdUI) { } void CChildView::OnRemoveSelected() { - std::list::iterator iter = m_shapes.begin(); + auto iter = m_shapes.begin(); while (iter != m_shapes.end()) { - if (*iter->selected_ == true) { + if ((*iter)->selected_ == true) { iter = m_shapes.erase(iter); } else { diff --git a/ChildView.h b/ChildView.h index 64a46ab..fad5b95 100644 --- a/ChildView.h +++ b/ChildView.h @@ -48,31 +48,11 @@ class CChildView : public CWnd // 고무벽 정보 CRect m_wall_rect{CPoint{}, CSize{20, 200}}; - // 직사각형 리스트 - //std::list m_rects; -<<<<<<< Updated upstream - // 도형 리스트 std::list m_shapes; -======= ->>>>>>> Stashed changes - // 도형 리스트 - std::list m_shapes; -<<<<<<< Updated upstream - // 원 리스트 - //std::list m_circles; -======= -<<<<<<< HEAD - // 원 벡터 - std::list m_circles; -======= - - // 원 리스트 - //std::list m_circles; ->>>>>>> 3f8f7a648268bceffa683ba6322bd09e52b9c7a6 ->>>>>>> Stashed changes + void CalculateBall(); // 영역 선택 변수들 From 52f7e5178b24fff1d4d463dab08360206037fa02 Mon Sep 17 00:00:00 2001 From: woojinrnd Date: Tue, 19 Dec 2023 16:05:28 +0900 Subject: [PATCH 06/11] drawline_curve --- ChildView.cpp | 21 +++++++++++++++++++++ ChildView.h | 9 +++++++++ 2 files changed, 30 insertions(+) diff --git a/ChildView.cpp b/ChildView.cpp index 2d97331..7b16c49 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -252,6 +252,7 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { // 직선 그리기 //Line(dc, {100, 100}, {200, 300}); + Line(dc, { m_pntOld.x, m_pntOld.y }, {m_pntCur.x, m_pntCur.y}); // 폴리곤 그리기 //Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); @@ -266,6 +267,13 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { CPoint center{ x.left + rad, x.top + rad }; Circle(dc, center, rad, RGB(255, 255, 255)); } + + // 곡선 그리기 + for (auto iter = m_points.begin(); iter != m_points.end(); iter++) { + if ((iter + 1) != m_points.end()) { + Line(dc, {(*iter).x, (*iter).y}, {(*(iter + 1)).x, (*(iter + 1)).y}); + } + } } void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) @@ -359,6 +367,12 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_circles.back().right = p.x; m_circles.back().bottom = p.y; break; + case kToolbarDrawLine: + m_pntCur = p; + break; + case kToolbarDrawCurve: + m_points.push_back(p); + break; } }); @@ -372,6 +386,13 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) case kToolbarDrawCircle: m_circles.push_back(CRect{ CPoint{p.x, p.y},CSize{0,0} }); break; + case kToolbarDrawLine: + m_pntOld = p; + m_pntCur = p; + break; + case kToolbarDrawCurve: + m_points.push_back(p); + break; } }); m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { m_mouse_event = "LButtonUp"; }); diff --git a/ChildView.h b/ChildView.h index 117a3c3..312d239 100644 --- a/ChildView.h +++ b/ChildView.h @@ -34,8 +34,17 @@ class CChildView : public CWnd public: CPoint m_mouse_pos; + CPoint m_pntOld; + CPoint m_pntCur; + + //std::vector m_pntOld; + //std::vector m_pntCur; + + std::vector m_points; CString m_mouse_event{"None"}; CString m_current_time; + + UINT m_keyboard = -1; From d7d3cd92193d6374bf058cf5f31ec68b4458019d Mon Sep 17 00:00:00 2001 From: yejin <98yejin22@gmail.com> Date: Tue, 19 Dec 2023 16:06:24 +0900 Subject: [PATCH 07/11] Select Area complete --- ChildView.cpp | 35 +++++++++++++++++++++++++++-------- ChildView.h | 3 +-- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index 96c558e..ba31246 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -259,20 +259,23 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { // 폴리곤 그리기 //Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); + + // 선택 영역 직사각형 표기 + Area = CRect(TOP_LEFT, BOTTOM_RIGHT); + Rectangle(dc, Area, RGB(255, 255, 255)); + for (auto x : m_shapes) { + auto color = RGB(255, 255, 0); + if (x->selected_) color = RGB(0, 0, 255); if(dynamic_cast(x)) - Rectangle(dc, CRect{ x->p1_, x->p2_ }, RGB(255, 255, 0), 0); + Rectangle(dc, CRect{ x->p1_, x->p2_ }, color, 0); else if (dynamic_cast(x)) { int rad = abs(x->p1_.x - x->p2_.x) / 2; CPoint center{ (x->p1_.x + x->p2_.x) / 2, (x->p1_.y + x->p2_.y) / 2 }; - Circle(dc, center, rad, RGB(255, 255, 255)); + Circle(dc, center, rad, color); } } - // 선택 영역 직사각형 표기 - CRect Area(TOP_LEFT, BOTTOM_RIGHT); - - Rectangle(dc, Area, RGB(255, 255, 255)); } void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) @@ -419,10 +422,26 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { if (m_toolbar_mode == kToolbarSelectArea) { // 툴바에서 영역 선택 버튼을 눌렀을 경우 BOTTOM_RIGHT = p; + + auto iter = m_shapes.begin(); + + while (iter != m_shapes.end()) { + int shape_tl_x = (*iter)->p1_.x; + int shape_tl_y = (*iter)->p1_.y; + + int shape_br_x = (*iter)->p2_.x; + int shape_br_y = (*iter)->p2_.y; + + if (TOP_LEFT.x <= shape_tl_x && shape_br_x <= BOTTOM_RIGHT.x && TOP_LEFT.y <= shape_tl_y && shape_br_y <= BOTTOM_RIGHT.y) { + (*iter)->selected_ = true; + } + else { + (*iter)->selected_ = false; + } + iter++; + } } }); - - return 0; } void CChildView::OnMouseMove(UINT nFlags, CPoint point) { diff --git a/ChildView.h b/ChildView.h index fad5b95..4b5083c 100644 --- a/ChildView.h +++ b/ChildView.h @@ -51,13 +51,12 @@ class CChildView : public CWnd // 도형 리스트 std::list m_shapes; - - void CalculateBall(); // 영역 선택 변수들 CPoint TOP_LEFT; CPoint BOTTOM_RIGHT; + CRect Area; public: From 81d68fcbf590ea74c3573c1eef3d30703c23f186 Mon Sep 17 00:00:00 2001 From: yejin <98yejin22@gmail.com> Date: Tue, 19 Dec 2023 16:10:42 +0900 Subject: [PATCH 08/11] Area Remove MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 선택 영역 삭제 시 선택 영역 사각형 사라짐 기능 추가 --- ChildView.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChildView.cpp b/ChildView.cpp index ba31246..b758d1e 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -561,6 +561,8 @@ void CChildView::OnRemoveSelected() { iter++; } } + TOP_LEFT = { 0,0 }; + BOTTOM_RIGHT = { 0,0 }; } From 437f6e45ed35b47f62f4048a0f8ccecae6607c51 Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 16:27:00 +0900 Subject: [PATCH 09/11] Update ChildView.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 선택영역(Area) 색 변경(파란 점선 테두리) * 선택영역 안에 포함된(selected_) 도형은 파란색으로 변경 --- ChildView.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index ba31246..0c4db98 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -69,7 +69,7 @@ void Circle(CDC* dc, void Rectangle(CDC* dc, CRect rect, COLORREF color, int thickness = 1, COLORREF color_line = RGB(0, 0, 0)) { - CPen pen(thickness <= 0 ? PS_NULL : PS_SOLID, thickness, color_line); + CPen pen(thickness <= 0 ? PS_DASH : PS_SOLID, thickness, color_line); auto pen_prev = dc->SelectObject(&pen); CBrush brush(color); @@ -262,13 +262,13 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { // 선택 영역 직사각형 표기 Area = CRect(TOP_LEFT, BOTTOM_RIGHT); - Rectangle(dc, Area, RGB(255, 255, 255)); + Rectangle(dc, Area, RGB(255, 255, 255), -1, RGB(0, 0, 255)); for (auto x : m_shapes) { auto color = RGB(255, 255, 0); if (x->selected_) color = RGB(0, 0, 255); if(dynamic_cast(x)) - Rectangle(dc, CRect{ x->p1_, x->p2_ }, color, 0); + Rectangle(dc, CRect{ x->p1_, x->p2_ }, color, 1); else if (dynamic_cast(x)) { int rad = abs(x->p1_.x - x->p2_.x) / 2; CPoint center{ (x->p1_.x + x->p2_.x) / 2, (x->p1_.y + x->p2_.y) / 2 }; @@ -561,6 +561,8 @@ void CChildView::OnRemoveSelected() { iter++; } } + BOTTOM_RIGHT = 0; + TOP_LEFT = 0; } From ba9803ebc012affda3cb36ede5bbaa9468ce70fd Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 17:06:49 +0900 Subject: [PATCH 10/11] Edit Curves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit line 을 벡터로 담아버림 --- ChildView.cpp | 25 +++++++++++++++++++------ ChildView.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index 7b16c49..157e8fc 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -269,11 +269,14 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { } // 곡선 그리기 - for (auto iter = m_points.begin(); iter != m_points.end(); iter++) { - if ((iter + 1) != m_points.end()) { - Line(dc, {(*iter).x, (*iter).y}, {(*(iter + 1)).x, (*(iter + 1)).y}); + for (auto curve : m_curves) { + for (auto iter = curve.begin(); iter != curve.end(); iter++) { + if ((iter + 1) != curve.end()) { + Line(dc, { (*iter).x, (*iter).y }, { (*(iter + 1)).x, (*(iter + 1)).y }); + } } } + } void CChildView::OnContextMenu(CWnd* pWnd, CPoint point) @@ -371,7 +374,8 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_pntCur = p; break; case kToolbarDrawCurve: - m_points.push_back(p); + //m_points.push_back(p); + m_curves.back().push_back(p); break; } @@ -391,11 +395,20 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_pntCur = p; break; case kToolbarDrawCurve: - m_points.push_back(p); + if (m_curves.size() == 0) { + m_curves.push_back(std::vector{p}); + } + //m_points.push_back(p); break; } }); - m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { m_mouse_event = "LButtonUp"; }); + m_mouse_event_listeners.Add(kMouseLButtonUp, [this](auto, auto p) { + m_mouse_event = "LButtonUp"; + switch (m_toolbar_mode) { + case kToolbarDrawCurve: + m_curves.push_back(std::vector{}); + } + }); m_mouse_event_listeners.Add(kMouseLButtonDblClk, [this](auto, auto p) { m_mouse_event = "LButtonDblClk"; }); m_mouse_event_listeners.Add(kMouseRButtonDown, [this](auto, auto p) { m_mouse_event = "RButtonDown"; }); diff --git a/ChildView.h b/ChildView.h index 312d239..9cf7121 100644 --- a/ChildView.h +++ b/ChildView.h @@ -41,6 +41,7 @@ class CChildView : public CWnd //std::vector m_pntCur; std::vector m_points; + std::vector> m_curves; CString m_mouse_event{"None"}; CString m_current_time; From d235657a5eef65ed3221535ef46b8cc5ab4e933c Mon Sep 17 00:00:00 2001 From: re-ag <763k357@naver.com> Date: Tue, 19 Dec 2023 17:31:23 +0900 Subject: [PATCH 11/11] Add line vector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit line도 여러개여야 해~ --- ChildView.cpp | 16 +++++++++------- ChildView.h | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ChildView.cpp b/ChildView.cpp index 8a5d20a..ffc068c 100644 --- a/ChildView.cpp +++ b/ChildView.cpp @@ -255,7 +255,10 @@ afx_msg void CChildView::OnMyPaint(CDC* dc) { // 직선 그리기 //Line(dc, {100, 100}, {200, 300}); - Line(dc, { m_pntOld.x, m_pntOld.y }, {m_pntCur.x, m_pntCur.y}); + //Line(dc, { m_pntOld.x, m_pntOld.y }, {m_pntCur.x, m_pntCur.y}); + for (auto line : m_lines) { + Line(dc, line.first, line.second); + } // 폴리곤 그리기 //Polygon(dc, {{300, 100}, {300, 50}, {250, 75}, {250, 100}}, RGB(255, 0, 255)); @@ -381,7 +384,8 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_shapes.back()->p2_ = p; break; case kToolbarDrawLine: - m_pntCur = p; + //m_pntCur = p; + m_lines.back().second = p; break; case kToolbarDrawCurve: //m_points.push_back(p); @@ -395,17 +399,15 @@ int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) m_mouse_event = "LButtonDown"; switch (m_toolbar_mode) { case kToolbarDrawRectangle: - //m_rects.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); m_shapes.push_back(new CRectangle(CPoint{ p.x, p.y }, CPoint{p.x, p.y})); - //m_shapes.push_back(std::make_shared(CPoint{ p.x, p.y })); break; case kToolbarDrawCircle: - //m_circles.push_back(CRect{ CPoint{p.x, p.y}, CSize{0,0} }); m_shapes.push_back(new CCircle(CPoint{ p.x, p.y }, CPoint{ p.x, p.y })); break; case kToolbarDrawLine: - m_pntOld = p; - m_pntCur = p; + m_lines.push_back({ CPoint(p), CPoint(p) }); + /*m_pntOld = p; + m_pntCur = p;*/ break; case kToolbarDrawCurve: if (m_curves.size() == 0) { diff --git a/ChildView.h b/ChildView.h index 988bb30..a483f25 100644 --- a/ChildView.h +++ b/ChildView.h @@ -43,6 +43,7 @@ class CChildView : public CWnd std::vector m_points; std::vector> m_curves; + std::vector < std::pair> m_lines; CString m_mouse_event{"None"}; CString m_current_time;