남윤형

기본 클래스 구성 및 화면 디자인(사각형)

1 +using System;
2 +using System.Collections.Generic;
3 +using System.Linq;
4 +using System.Text;
5 +using System.Threading.Tasks;
6 +using System.Windows.Forms;
7 +
8 +namespace flowchart
9 +{
10 + // flowchart를 그리는 판넬에 필요한 기능을 삽입. (Panel 객체를 상속해서 사용했음)
11 + // 마우스 클릭을 놓으면 어떤 도형을 선택했는지 판단해서, 해당 자료구조를 생성하고, 페인트 함수를 통해 그린다.
12 + class CustomPanel : Panel
13 + {
14 + private String _selectName;
15 + private List<FigBase> _shapes = new List<FigBase>();
16 +
17 + public string SelectName { get => _selectName; set => _selectName = value; }
18 +
19 + protected override void OnMouseUp(MouseEventArgs e)
20 + {
21 + //MessageBox.Show("Added shape. " + SelectName + " " + e.Location.ToString());
22 +
23 + if (SelectName == "RECTANGLE")
24 + {
25 + // 사각형에 대한 정보를 자료구조에 삽입한다.
26 + FigRectangle rectangle = new FigRectangle(e.Location, new System.Drawing.Size(100, 100));
27 + _shapes.Add(rectangle);
28 + }
29 + else if (SelectName == "ELLIPSE")
30 + {
31 + // TODO : 원 그리기
32 + }
33 + else if (SelectName == "TRIANGLE")
34 + {
35 + // TODO : 삼각형 그리기
36 + }
37 +
38 + this.Cursor = Cursors.Default;
39 + this.Refresh(); // 다시 그리기 요청
40 + base.OnMouseUp(e);
41 + }
42 +
43 + // 실제 그리는 OnPaint를 통해 내가 작성한 Draw함수를 호출한다.
44 + protected override void OnPaint(PaintEventArgs e)
45 + {
46 + foreach (FigBase s in _shapes)
47 + {
48 + s.Draw(e.Graphics);
49 + }
50 +
51 + base.OnPaint(e);
52 + }
53 + }
54 +}
1 +using System;
2 +using System.Collections.Generic;
3 +using System.Drawing;
4 +using System.Linq;
5 +using System.Text;
6 +using System.Threading.Tasks;
7 +
8 +namespace flowchart
9 +{
10 + // flowchart 도형을 그리는 클래스의 공통(부모 클래스)
11 + // 변수: 위치(_location), 크기(_size)
12 + // 함수: 그리기(Draw)
13 + class FigBase
14 + {
15 + private Point _location; // 위치 변수
16 + private Size _size; // 크기 변수
17 +
18 + protected FigBase(Point location, Size size) // 생성자 (위치와 크기를 저장)
19 + {
20 + _location = location;
21 + _size = size;
22 + }
23 +
24 + // 위치와 크기 변수의 값을 읽고 쓰는 함수
25 + public Point Location { get => _location; set => _location = value; }
26 + public Size Size { get => _size; set => _size = value; }
27 +
28 + // 자식 클래스에 필요한 공통 함수
29 + public virtual void Draw(Graphics g)
30 + {
31 +
32 +
33 + }
34 + }
35 +}
1 +using System;
2 +using System.Collections.Generic;
3 +using System.Drawing;
4 +using System.Linq;
5 +using System.Text;
6 +using System.Threading.Tasks;
7 +
8 +namespace flowchart
9 +{
10 + // 프로세스 사각형을 그리는 클래스(FigureBase를 상속)
11 + // Draw 함수에서 사각형을 그린다.
12 + class FigRectangle : FigBase
13 + {
14 + // 생성자도 상속해서 사용.
15 + public FigRectangle(Point location, Size size) : base(location, size)
16 + {
17 +
18 + }
19 +
20 + public override void Draw(Graphics g)
21 + {
22 + using (Pen pen = new Pen(Color.Red, 1))
23 + {
24 + System.Drawing.Rectangle rect = new System.Drawing.Rectangle(this.Location, this.Size);
25 + g.DrawRectangle(pen, rect); // 사각형 그리는 함수
26 +
27 + }
28 +
29 + base.Draw(g);
30 + }
31 + }
32 +}
1 +using System;
2 +using System.Collections.Generic;
3 +using System.ComponentModel;
4 +using System.Data;
5 +using System.Drawing;
6 +using System.Linq;
7 +using System.Text;
8 +using System.Threading.Tasks;
9 +using System.Windows.Forms;
10 +
11 +namespace flowchart
12 +{
13 + public partial class MainForm : Form
14 + {
15 + public MainForm()
16 + {
17 + InitializeComponent();
18 + }
19 +
20 + private void btn_rec_Click(object sender, EventArgs e)
21 + {
22 + CustomPanel.SelectName = "RECTANGLE";
23 + CustomPanel.Cursor = Cursors.Hand;
24 + }
25 +
26 + private void btn_default_Click(object sender, EventArgs e)
27 + {
28 + CustomPanel.SelectName = "NONE";
29 + CustomPanel.Cursor = Cursors.Default;
30 + }
31 + }
32 +}