남윤형

각 도형의 위치를 마우스로 클릭해서 이동하게 해줌

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -11,32 +12,97 @@ namespace flowchart
// 마우스 클릭을 놓으면 어떤 도형을 선택했는지 판단해서, 해당 자료구조를 생성하고, 페인트 함수를 통해 그린다.
class CustomPanel : Panel
{
private String _selectName;
private List<FigBase> _shapes = new List<FigBase>();
private String _figName; // NONE, RECTANGLE, RHOMBUS
private List<FigBase> _shapes = new List<FigBase>(); // 선택된 도형을 저장한 리스트 자료구조
private String _state; // NONE, DRAW, MOVE
private Point _dragStartPoint = new Point(-1, -1); // 도형을 움직일때 시작위치
private FigBase _findShape = null; // 자료구조에서 찾은 도형을 임시 저장하는 변수
public string SelectName { get => _selectName; set => _selectName = value; }
// 변수를 클래스 밖에서 읽고 쓰게 하는 함수
public string FigName { get { return _figName; } set { _figName = value; } }
public String State { get { return _state; } set { _state = value; } }
// 마우스를 판넬에서 움질일때 호출되는 이벤트
protected override void OnMouseMove(MouseEventArgs e)
{
// System.Diagnostics.Trace.WriteLine("debug >>>" + e.Location);
// 마우스 버튼을 누르지 않은 상태일 경우
if (e.Button == MouseButtons.None )
{
bool find = false;
foreach (FigBase s in _shapes)
{
// 현재 마우스 위치가 지금껏 그린 리스트 자료구조 안의 도형의 영역안에 있는지 확인
if (s.PointInRegion(e.Location))
{
find = true;
}
}
// 그려진 도형위에 마우스가 오면 마우스 모양을 변경
if (find)
Cursor = Cursors.SizeAll;
else
Cursor = Cursors.Default;
}
// 마우스를 클릭했을때
else if (e.Button == MouseButtons.Left)
{
foreach (FigBase s in _shapes)
{
// 자료구조안의 위치와 동일할 경우 해당 자료구조를 다시 가져온다.
if (s.PointInRegion(e.Location))
{
_findShape = s;
break;
}
}
// 도형을 찾았으면 움직이는 상태로 변경 후, 현재 마우스 위치를 저장함.
if (_findShape != null)
{
State = "MOVE";
_dragStartPoint = e.Location;
}
}
base.OnMouseMove(e);
}
// 실제 도형을 그리거나 이동하는 함수, 최종 OnPaint() 함수가 호출되어 실행됨
protected override void OnMouseUp(MouseEventArgs e)
{
//MessageBox.Show("Added shape. " + SelectName + " " + e.Location.ToString());
// 그리기 상태
if (State == "DRAW")
{
if (SelectName == "RECTANGLE")
if (FigName == "RECTANGLE")
{
// 사각형에 대한 정보를 자료구조에 삽입한다.
FigRectangle rectangle = new FigRectangle(e.Location, new System.Drawing.Size(100, 100));
_shapes.Add(rectangle);
}
else if (SelectName == "ELLIPSE")
else if (FigName == "RHOMBUS")
{
// TODO : 원 그리기
FigRhombus rhombus = new FigRhombus(e.Location, new System.Drawing.Size(100, 100));
_shapes.Add(rhombus);
}
else if (SelectName == "TRIANGLE")
else if (FigName == "TRIANGLE")
{
// TODO : 삼각형 그리기
}
}
// 움직이는 상태
else if (State == "MOVE")
{
if (_findShape != null)
{
_findShape.Location = e.Location;
}
}
this.Cursor = Cursors.Default;
this.Refresh(); // 다시 그리기 요청
State = "NONE";
this.Refresh(); // 다시 그리기 요청: OnPaint()
base.OnMouseUp(e);
}
......
......@@ -31,5 +31,12 @@ namespace flowchart
}
// 현재 마우스의 위치가 해당 영역내에 있는지를 판단하는 함수
public virtual bool PointInRegion(Point mousePoint)
{
Rectangle rect = new Rectangle(_location, _size);
return rect.Contains(mousePoint);
}
}
}
......
......@@ -7,8 +7,6 @@ using System.Threading.Tasks;
namespace flowchart
{
// 프로세스 마름모를 그리는 클래스(FigureBase를 상속)
// Draw 함수에서 마름모를 그린다.
class FigRhombus : FigBase
{
// 생성자도 상속해서 사용.
......@@ -21,21 +19,19 @@ namespace flowchart
{
using (Pen pen = new Pen(Color.Red, 1))
{
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(this.Location, this.Size);
// 마름모 그리는 함수
//Rectangle rect = new Rectangle(this.Location, this.Size);
int x1, x2, x3, y1, y2, y3;
x1 = Location.X;
x2 = x1 + Size.Width / 2;
x3 = x1+Size.Width;
x2 = Location.X + Size.Width / 2;
x3 = Location.X + Size.Width;
y1 = Location.Y;
y2 = y1 - Size.Height / 2;
y3 = y1 - Size.Height;
y2 = Location.Y + Size.Height / 2;
y3 = Location.Y + Size.Height;
g.DrawLine(pen, x1, y2, x2, y1);
g.DrawLine(pen, x2, y1, x3, y2);
g.DrawLine(pen, x3, y2, x2, y3);
g.DrawLine(pen, x2, y3, x1, y2);
}
base.Draw(g);
......
......@@ -17,16 +17,25 @@ namespace flowchart
InitializeComponent();
}
private void btn_rec_Click(object sender, EventArgs e)
private void btn_default_Click(object sender, EventArgs e)
{
CustomPanel.State = "NONE";
CustomPanel.FigName = "NONE";
CustomPanel.Cursor = Cursors.Default;
}
private void btn_rectangle_Click(object sender, EventArgs e)
{
CustomPanel.SelectName = "RECTANGLE";
CustomPanel.State = "DRAW"; // 도형을 그리겠다고 선택
CustomPanel.FigName = "RECTANGLE"; // 사각형을 선택
CustomPanel.Cursor = Cursors.Hand;
}
private void btn_default_Click(object sender, EventArgs e)
private void btn_rhombus_Click(object sender, EventArgs e)
{
CustomPanel.SelectName = "NONE";
CustomPanel.Cursor = Cursors.Default;
CustomPanel.State = "DRAW";
CustomPanel.FigName = "RHOMBUS";
CustomPanel.Cursor = Cursors.Hand;
}
}
}
......