Showing
4 changed files
with
102 additions
and
24 deletions
| 1 | using System; | 1 | using System; |
| 2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
| 3 | +using System.Drawing; | ||
| 3 | using System.Linq; | 4 | using System.Linq; |
| 4 | using System.Text; | 5 | using System.Text; |
| 5 | using System.Threading.Tasks; | 6 | using System.Threading.Tasks; |
| ... | @@ -11,32 +12,97 @@ namespace flowchart | ... | @@ -11,32 +12,97 @@ namespace flowchart |
| 11 | // 마우스 클릭을 놓으면 어떤 도형을 선택했는지 판단해서, 해당 자료구조를 생성하고, 페인트 함수를 통해 그린다. | 12 | // 마우스 클릭을 놓으면 어떤 도형을 선택했는지 판단해서, 해당 자료구조를 생성하고, 페인트 함수를 통해 그린다. |
| 12 | class CustomPanel : Panel | 13 | class CustomPanel : Panel |
| 13 | { | 14 | { |
| 14 | - private String _selectName; | 15 | + private String _figName; // NONE, RECTANGLE, RHOMBUS |
| 15 | - private List<FigBase> _shapes = new List<FigBase>(); | 16 | + private List<FigBase> _shapes = new List<FigBase>(); // 선택된 도형을 저장한 리스트 자료구조 |
| 17 | + private String _state; // NONE, DRAW, MOVE | ||
| 18 | + private Point _dragStartPoint = new Point(-1, -1); // 도형을 움직일때 시작위치 | ||
| 19 | + private FigBase _findShape = null; // 자료구조에서 찾은 도형을 임시 저장하는 변수 | ||
| 16 | 20 | ||
| 17 | - public string SelectName { get => _selectName; set => _selectName = value; } | 21 | + // 변수를 클래스 밖에서 읽고 쓰게 하는 함수 |
| 22 | + public string FigName { get { return _figName; } set { _figName = value; } } | ||
| 23 | + public String State { get { return _state; } set { _state = value; } } | ||
| 18 | 24 | ||
| 25 | + // 마우스를 판넬에서 움질일때 호출되는 이벤트 | ||
| 26 | + protected override void OnMouseMove(MouseEventArgs e) | ||
| 27 | + { | ||
| 28 | + // System.Diagnostics.Trace.WriteLine("debug >>>" + e.Location); | ||
| 29 | + // 마우스 버튼을 누르지 않은 상태일 경우 | ||
| 30 | + if (e.Button == MouseButtons.None ) | ||
| 31 | + { | ||
| 32 | + bool find = false; | ||
| 33 | + | ||
| 34 | + foreach (FigBase s in _shapes) | ||
| 35 | + { | ||
| 36 | + // 현재 마우스 위치가 지금껏 그린 리스트 자료구조 안의 도형의 영역안에 있는지 확인 | ||
| 37 | + if (s.PointInRegion(e.Location)) | ||
| 38 | + { | ||
| 39 | + find = true; | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + // 그려진 도형위에 마우스가 오면 마우스 모양을 변경 | ||
| 43 | + if (find) | ||
| 44 | + Cursor = Cursors.SizeAll; | ||
| 45 | + else | ||
| 46 | + Cursor = Cursors.Default; | ||
| 47 | + | ||
| 48 | + } | ||
| 49 | + // 마우스를 클릭했을때 | ||
| 50 | + else if (e.Button == MouseButtons.Left) | ||
| 51 | + { | ||
| 52 | + foreach (FigBase s in _shapes) | ||
| 53 | + { | ||
| 54 | + // 자료구조안의 위치와 동일할 경우 해당 자료구조를 다시 가져온다. | ||
| 55 | + if (s.PointInRegion(e.Location)) | ||
| 56 | + { | ||
| 57 | + _findShape = s; | ||
| 58 | + break; | ||
| 59 | + } | ||
| 60 | + } | ||
| 61 | + // 도형을 찾았으면 움직이는 상태로 변경 후, 현재 마우스 위치를 저장함. | ||
| 62 | + if (_findShape != null) | ||
| 63 | + { | ||
| 64 | + State = "MOVE"; | ||
| 65 | + _dragStartPoint = e.Location; | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + base.OnMouseMove(e); | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + // 실제 도형을 그리거나 이동하는 함수, 최종 OnPaint() 함수가 호출되어 실행됨 | ||
| 19 | protected override void OnMouseUp(MouseEventArgs e) | 73 | protected override void OnMouseUp(MouseEventArgs e) |
| 20 | { | 74 | { |
| 21 | - //MessageBox.Show("Added shape. " + SelectName + " " + e.Location.ToString()); | 75 | + // 그리기 상태 |
| 76 | + if (State == "DRAW") | ||
| 77 | + { | ||
| 22 | 78 | ||
| 23 | - if (SelectName == "RECTANGLE") | 79 | + if (FigName == "RECTANGLE") |
| 24 | { | 80 | { |
| 25 | // 사각형에 대한 정보를 자료구조에 삽입한다. | 81 | // 사각형에 대한 정보를 자료구조에 삽입한다. |
| 26 | FigRectangle rectangle = new FigRectangle(e.Location, new System.Drawing.Size(100, 100)); | 82 | FigRectangle rectangle = new FigRectangle(e.Location, new System.Drawing.Size(100, 100)); |
| 27 | _shapes.Add(rectangle); | 83 | _shapes.Add(rectangle); |
| 28 | } | 84 | } |
| 29 | - else if (SelectName == "ELLIPSE") | 85 | + else if (FigName == "RHOMBUS") |
| 30 | { | 86 | { |
| 31 | - // TODO : 원 그리기 | 87 | + FigRhombus rhombus = new FigRhombus(e.Location, new System.Drawing.Size(100, 100)); |
| 88 | + _shapes.Add(rhombus); | ||
| 32 | } | 89 | } |
| 33 | - else if (SelectName == "TRIANGLE") | 90 | + else if (FigName == "TRIANGLE") |
| 34 | { | 91 | { |
| 35 | // TODO : 삼각형 그리기 | 92 | // TODO : 삼각형 그리기 |
| 36 | } | 93 | } |
| 94 | + } | ||
| 95 | + // 움직이는 상태 | ||
| 96 | + else if (State == "MOVE") | ||
| 97 | + { | ||
| 98 | + if (_findShape != null) | ||
| 99 | + { | ||
| 100 | + _findShape.Location = e.Location; | ||
| 101 | + } | ||
| 102 | + } | ||
| 37 | 103 | ||
| 38 | - this.Cursor = Cursors.Default; | 104 | + State = "NONE"; |
| 39 | - this.Refresh(); // 다시 그리기 요청 | 105 | + this.Refresh(); // 다시 그리기 요청: OnPaint() |
| 40 | base.OnMouseUp(e); | 106 | base.OnMouseUp(e); |
| 41 | } | 107 | } |
| 42 | 108 | ... | ... |
| ... | @@ -31,5 +31,12 @@ namespace flowchart | ... | @@ -31,5 +31,12 @@ namespace flowchart |
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | } | 33 | } |
| 34 | + | ||
| 35 | + // 현재 마우스의 위치가 해당 영역내에 있는지를 판단하는 함수 | ||
| 36 | + public virtual bool PointInRegion(Point mousePoint) | ||
| 37 | + { | ||
| 38 | + Rectangle rect = new Rectangle(_location, _size); | ||
| 39 | + return rect.Contains(mousePoint); | ||
| 40 | + } | ||
| 34 | } | 41 | } |
| 35 | } | 42 | } | ... | ... |
| ... | @@ -7,8 +7,6 @@ using System.Threading.Tasks; | ... | @@ -7,8 +7,6 @@ using System.Threading.Tasks; |
| 7 | 7 | ||
| 8 | namespace flowchart | 8 | namespace flowchart |
| 9 | { | 9 | { |
| 10 | - // 프로세스 마름모를 그리는 클래스(FigureBase를 상속) | ||
| 11 | - // Draw 함수에서 마름모를 그린다. | ||
| 12 | class FigRhombus : FigBase | 10 | class FigRhombus : FigBase |
| 13 | { | 11 | { |
| 14 | // 생성자도 상속해서 사용. | 12 | // 생성자도 상속해서 사용. |
| ... | @@ -21,21 +19,19 @@ namespace flowchart | ... | @@ -21,21 +19,19 @@ namespace flowchart |
| 21 | { | 19 | { |
| 22 | using (Pen pen = new Pen(Color.Red, 1)) | 20 | using (Pen pen = new Pen(Color.Red, 1)) |
| 23 | { | 21 | { |
| 24 | - System.Drawing.Rectangle rect = new System.Drawing.Rectangle(this.Location, this.Size); | 22 | + //Rectangle rect = new Rectangle(this.Location, this.Size); |
| 25 | - // 마름모 그리는 함수 | ||
| 26 | int x1, x2, x3, y1, y2, y3; | 23 | int x1, x2, x3, y1, y2, y3; |
| 27 | x1 = Location.X; | 24 | x1 = Location.X; |
| 28 | - x2 = x1 + Size.Width / 2; | 25 | + x2 = Location.X + Size.Width / 2; |
| 29 | - x3 = x1+Size.Width; | 26 | + x3 = Location.X + Size.Width; |
| 30 | y1 = Location.Y; | 27 | y1 = Location.Y; |
| 31 | - y2 = y1 - Size.Height / 2; | 28 | + y2 = Location.Y + Size.Height / 2; |
| 32 | - y3 = y1 - Size.Height; | 29 | + y3 = Location.Y + Size.Height; |
| 33 | 30 | ||
| 34 | g.DrawLine(pen, x1, y2, x2, y1); | 31 | g.DrawLine(pen, x1, y2, x2, y1); |
| 35 | g.DrawLine(pen, x2, y1, x3, y2); | 32 | g.DrawLine(pen, x2, y1, x3, y2); |
| 36 | g.DrawLine(pen, x3, y2, x2, y3); | 33 | g.DrawLine(pen, x3, y2, x2, y3); |
| 37 | g.DrawLine(pen, x2, y3, x1, y2); | 34 | g.DrawLine(pen, x2, y3, x1, y2); |
| 38 | - | ||
| 39 | } | 35 | } |
| 40 | 36 | ||
| 41 | base.Draw(g); | 37 | base.Draw(g); | ... | ... |
| ... | @@ -17,16 +17,25 @@ namespace flowchart | ... | @@ -17,16 +17,25 @@ namespace flowchart |
| 17 | InitializeComponent(); | 17 | InitializeComponent(); |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | - private void btn_rec_Click(object sender, EventArgs e) | 20 | + private void btn_default_Click(object sender, EventArgs e) |
| 21 | + { | ||
| 22 | + CustomPanel.State = "NONE"; | ||
| 23 | + CustomPanel.FigName = "NONE"; | ||
| 24 | + CustomPanel.Cursor = Cursors.Default; | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + private void btn_rectangle_Click(object sender, EventArgs e) | ||
| 21 | { | 28 | { |
| 22 | - CustomPanel.SelectName = "RECTANGLE"; | 29 | + CustomPanel.State = "DRAW"; // 도형을 그리겠다고 선택 |
| 30 | + CustomPanel.FigName = "RECTANGLE"; // 사각형을 선택 | ||
| 23 | CustomPanel.Cursor = Cursors.Hand; | 31 | CustomPanel.Cursor = Cursors.Hand; |
| 24 | } | 32 | } |
| 25 | 33 | ||
| 26 | - private void btn_default_Click(object sender, EventArgs e) | 34 | + private void btn_rhombus_Click(object sender, EventArgs e) |
| 27 | { | 35 | { |
| 28 | - CustomPanel.SelectName = "NONE"; | 36 | + CustomPanel.State = "DRAW"; |
| 29 | - CustomPanel.Cursor = Cursors.Default; | 37 | + CustomPanel.FigName = "RHOMBUS"; |
| 38 | + CustomPanel.Cursor = Cursors.Hand; | ||
| 30 | } | 39 | } |
| 31 | } | 40 | } |
| 32 | } | 41 | } | ... | ... |
-
Please register or login to post a comment