FigBase.cs
4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace flowchart
{
// flowchart 도형을 그리는 클래스의 공통(부모 클래스)
class FigBase
{
private Point _location; // 위치 변수
private Size _size; // 크기 변수
private Point[] _linkPoints = new Point[] { Point.Empty, Point.Empty, Point.Empty, Point.Empty }; // Top, Left, Bottom, Right
// 텍스트 박스와 관련된 변수
private TextBox _textBox = null;
private string _text; // 텍스트박스 글자
private Rectangle _textArea; // 위치계산 용
private bool _editMode = false; // 더블클릭여부 판단
protected FigBase(Point location, Size size) // 생성자 (위치와 크기를 저장)
{
_location = location;
_size = size;
CalculateLinkPoint(); // 선을 연결하기 위해 도형 주위의 4개의 위치값을 재계산
CalculateTextArea(); // 텍스트박스의 위치를 재계산
}
// 내부 변수를 외부에서 접근하는 함수
public Point Location
{
get => _location;
set
{
_location = value;
CalculateLinkPoint();
CalculateTextArea();
}
}
public Size Size
{
get => _size;
set
{
_size = value;
CalculateLinkPoint();
CalculateTextArea();
}
}
public Point[] LinkPoints { get => _linkPoints; set => _linkPoints = value; }
// 자식 클래스에 필요한 공통 함수
public virtual void Draw(Graphics g)
{
// 에디트 모드 경우만 글자를 삽입한다.
if (!_editMode)
{
using (Font font = new Font("맑은 고딕", 16, FontStyle.Regular, GraphicsUnit.Pixel))
{
PointF pointF1 = new PointF(_textArea.X, _textArea.Y);
g.DrawString(_text, font, Brushes.Black, pointF1);
}
}
}
// 현재 마우스의 위치가 해당 영역내에 있는지를 판단하는 함수
public virtual bool PointInRegion(Point mousePoint)
{
Rectangle rect = new Rectangle(_location, _size);
return rect.Contains(mousePoint);
}
// 도형의 주위의 4군데 위치를 저장
private void CalculateLinkPoint()
{
_linkPoints[0] = new Point(_location.X + (int)(((float)_size.Width) / 2), _location.Y); // Top
_linkPoints[1] = new Point(_location.X, _location.Y + (int)(((float)_size.Height) / 2)); // Left
_linkPoints[2] = new Point(_location.X + (int)(((float)_size.Width) / 2), _location.Y + _size.Height); // Bottom
_linkPoints[3] = new Point(_location.X + _size.Width, _location.Y + (int)(((float)_size.Height) / 2)); // Right
}
// 텍스트 박스의 위치를 계산한다.
private void CalculateTextArea()
{
_textArea = new Rectangle(_location, _size);
_textArea.Inflate(-20, -20);
}
// 도형에서 마우스를 더블클릭하면 호출된다.
public virtual void EnterEditMode()
{
if (!_editMode)
{
_editMode = true;
if (_textBox == null)
{
_textBox = new TextBox();
_textBox.Font = new Font("맑은 고딕", 16, FontStyle.Regular, GraphicsUnit.Pixel);
_textBox.Parent = CustomPanel._parentControl; // 판넬을 부모로 지정
_textBox.KeyDown += TextBox_KeyDown; // 키다운 이벤트를 호출한다.
}
else
{
_textBox.Show();
}
_textBox.Location = _textArea.Location;
_textBox.Size = _textArea.Size;
}
}
// 에디트 모드를 종료한댜.
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
TextBox textBox = (TextBox)sender;
_text = textBox.Text;
textBox.Hide();
textBox.Clear();
_editMode = false;
}
}
}
}