FigBase.cs 2.5 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace flowchart
{
    // flowchart 도형을 그리는 클래스의 공통(부모 클래스)
    // 변수: 위치(_location), 크기(_size). 링크선 위치(_linkPoints)
    // 함수: 그리기(Draw), 영역내에 있는지 확인(PointInRegion)
    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

        protected FigBase(Point location, Size size)  // 생성자 (위치와 크기를 저장)
        {
            _location = location;
            _size = size;
            CalculateLinkPoint();
        }

        // 내부 변수를 외부에서 접근하는 함수
        public Point Location 
        { 
            get => _location; 
            set 
            { 
                _location = value; 
                CalculateLinkPoint(); // 선을 연결하기 위해 도형 주위의 4개의 위치값을 재계산
            }
        }
        public Size Size 
        { 
            get => _size;
            set
            {
                _size = value;
                CalculateLinkPoint();  // 선을 연결하기 위해 도형 주위의 4개의 위치값을 재계산
            }
        }
        public Point[] LinkPoints { get => _linkPoints; set => _linkPoints = value; }

        // 자식 클래스에 필요한 공통 함수
        public virtual void Draw(Graphics g)
        {


        }

        // 현재 마우스의 위치가 해당 영역내에 있는지를 판단하는 함수
        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
        }
    }
}