Exemplo n.º 1
0
        /// <summary>
        /// 마우스 업 이벤트
        /// DrawObject 의 추가, 선택, 이동, 사이즈 변경 등 후에 마우스 클릭을 놓으면 이벤트가 마무리 된다.
        /// </summary>
        private void DrawBox_MouseUp(object sender, MouseEventArgs e)
        {
            //마우스 왼쪽 버튼이 클릭된 상태였고, DrawObjectType 이 선택하기가 아닐 때,
            if (e.Button == MouseButtons.Left && !(MainController.Instance.DrawObjectType == DrawObjectType.Select))
            {
                //DrawBox 의 상태를 아무것도 지정하지 않는다.
                MainController.Instance.SelectMode = SelectMode.None;

                //새롭게 추가되어 그려진 DrawObject 를 최종 상태로 설정한다.
                MainController.Instance.GraphicModel.GrapList[0].Normalize();

                //Pencil 변수를 null 로 초기화 한다.
                this.mNewPencil = null;

                MainController.Instance.Notify(ObserverAction.Select);
            }
            else
            {
                ////DrawBox 의 상태가 영역으로 선택하기 일 때
                if (MainController.Instance.SelectMode == SelectMode.NetSelection)
                {
                    ControlPaint.DrawReversibleFrame(this.RectangleToScreen(RectangleObject.GetNormalizedRectangle(this.mStartPoint, this.mLastPoint)), Color.Black, FrameStyle.Dashed);

                    //모든 DrawObject 의 선택을 해제한다.
                    this.UnSelectAll();

                    //마우스의 처음과 마지막 위치 만큼의 Rectangle 을 생성한다.
                    Rectangle rec = RectangleObject.GetNormalizedRectangle(this.mStartPoint, this.mLastPoint);

                    //rec 의 영역에 DrawObject 가 포함된다면 선택된걸로 설정한다.
                    foreach (DrawObject o in MainController.Instance.GraphicModel.GrapList)
                    {
                        if (o.IntersectsWith(rec))
                        {
                            o.Selected = true;
                        }
                    }

                    //DrawBox 의 상태를 아무것도 지정하지 않는다.
                    MainController.Instance.SelectMode = SelectMode.None;
                }

                //DrawObjec 의 사이즈 변경 변수가 Null 이 아니라면 변경된 된 크기만큼 최종적으로 설정해준다.
                if (this.mResizedObject != null)
                {
                    this.mResizedObject.Normalize();
                    this.mResizedObject = null;
                }

                //DrawBox 의 Paint 이벤트를 호출한다.
                this.Invalidate(false);
            }

            //마우스 캡쳐를 해제한다.
            this.Capture = false;
        }
Exemplo n.º 2
0
        /// <summary>
        /// 마우스 이동 이벤트, DrawObejct 를 그리거나, 이동하거, 사이즈를 조절할 때 사용된다.
        /// </summary>
        private void DrawBox_MouseMove(object sender, MouseEventArgs e)
        {
            this.mOldPoint = this.mLastPoint;

            //마우스 왼쪽 클릭이고, DrawObjectType 이 선택하기가 아닐 때
            if (e.Button == MouseButtons.Left && MainController.Instance.DrawObjectType != DrawObjectType.Select)
            {
                //Pencil 그리기 일때
                if (MainController.Instance.DrawObjectType == DrawObjectType.Pencil && this.mNewPencil != null)
                {
                    Point point    = new Point(e.X, e.Y);
                    int   distance = (e.X - this.mLastX) * (e.X - this.mLastX) + (e.Y - this.mLastY) * (e.Y - this.mLastY);

                    //연결점 사이의 거리가 최소 거리보다 적을 때
                    if (distance < mMinDistance)
                    {
                        //Pencil의 라인을 연장해서 그린다
                        this.mNewPencil.MoveHandleTo(point, this.mNewPencil.HandleCount);
                    }
                    else //연결점 사이의 거리가 최소 거리보다 멀 때
                    {
                        //새로운 연결점 추가
                        this.mNewPencil.AddPoint(e.Location);
                        this.mLastX = e.X;
                        this.mLastY = e.Y;
                    }
                }
                else
                {
                    //Pencil 이 DrawObject 를 그려준다.
                    MainController.Instance.GraphicModel.GrapList[0].MoveHandleTo(e.Location, 5);
                }

                //DrawBox 의 Paint 이벤트를 호출해서 새롭게 그린다.
                this.Invalidate(false);
                return;
            }

            //마우스 왼쪽 클릭이고, DrawObjectType 이 선택하기 일때
            else if (e.Button == MouseButtons.Left && MainController.Instance.DrawObjectType == DrawObjectType.Select)
            {
                //마우스의 현재 위치에서 마지막 위치를 뺀 값을 저장한다.
                int distanceX = e.X - mLastPoint.X;
                int distanceY = e.Y - mLastPoint.Y;

                //마우스의 현재 위치를 마지막 값으로 저장한다.
                this.mLastPoint = e.Location;

                //DrawBox 의 현재 상태가 사이즈 변경 모드일때
                if (MainController.Instance.SelectMode == SelectMode.Size)
                {
                    if (this.mResizedObject != null)
                    {
                        //DrawObject 의 사이즈를 변경한다.
                        this.mResizedObject.MoveHandleTo(e.Location, this.mResizedObjectHandle);

                        //DrawBox의 Paint 이벤트를 호출한다.
                        this.Invalidate(false);

                        return;
                    }
                }

                //DrawBox 의 현재 상태가 이동 모드일때
                if (MainController.Instance.SelectMode == SelectMode.Move)
                {
                    //선택된 모든 DrawObject의 위치를 이동한다.
                    foreach (DrawObject o in MainController.Instance.GraphicModel.GrapList)
                    {
                        if (o.Selected)
                        {
                            o.Move(distanceX, distanceY);
                        }
                    }

                    //마우스 커서를 변경한다.
                    this.Cursor = Cursors.SizeAll;

                    //DrawBox 의 Paint 이벤트를 호출한다.
                    this.Invalidate(false);

                    return;
                }

                //DrawBox 의 현재 상태가 영역으로 선택 모드일때
                if (MainController.Instance.SelectMode == SelectMode.NetSelection)
                {
                    //마우스로 이동된 만큼 영역을 그려준다.
                    ControlPaint.DrawReversibleFrame(this.RectangleToScreen(RectangleObject.GetNormalizedRectangle(this.mStartPoint, this.mOldPoint)), Color.Black, FrameStyle.Dashed);
                    ControlPaint.DrawReversibleFrame(this.RectangleToScreen(RectangleObject.GetNormalizedRectangle(this.mStartPoint, e.Location)), Color.Black, FrameStyle.Dashed);

                    return;
                }
            }

            //마우스가 클릭이 된 것이 없고, DrawObjectType 이 선택하기 일때
            else if (e.Button == System.Windows.Forms.MouseButtons.None && MainController.Instance.DrawObjectType == DrawObjectType.Select)
            {
                //핸들의 위치에 맞게 마우스 커서를 변경해준다.
                foreach (DrawObject ob in MainController.Instance.GraphicModel.GrapList)
                {
                    Cursor = ob.GetHandleCursor(ob.HitTest(e.Location));
                    return;
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// 마우스 다운 이벤트, 새롭게 객체를 그리거나, 그려진 객체를 선택한다.
        /// </summary>
        private void DrawBox_MouseDown(object sender, MouseEventArgs e)
        {
            //마우스가 왼쪽 클릭이고, 그리기 도구에서 선택하기를 선택했을 경우
            if (e.Button == MouseButtons.Left && MainController.Instance.DrawObjectType == DrawObjectType.Select)
            {
                //현재 DrawBox 상태를 아무것도 지정하지 않는다.
                MainController.Instance.SelectMode = SelectMode.None;

                foreach (DrawObject ob in MainController.Instance.GraphicModel.GrapList)
                {
                    int handleNumber = ob.HitTest(e.Location); //현재 클릭된 위치의 handleNumber 를 반환한다.

                    //handleNumber 가 0보다 크다면 DrawObject 가 선택 된 것이다.
                    if (handleNumber > 0)
                    {
                        //현재 DrawBox 상태를 사이즈 변경 모드로 변경한다.
                        MainController.Instance.SelectMode = SelectMode.Size;

                        //사이즈 변경을 할 수 있도록 준비한다.
                        this.mResizedObject       = ob;
                        this.mResizedObjectHandle = handleNumber;

                        //DrawBox 그려진 모든 DrawObject 의 선택을 해제한다.
                        this.UnSelectAll();

                        //현재 클릭된 DrawObejct 를 선택한다.
                        ob.Selected = true;

                        break;
                    }
                }

                if (MainController.Instance.SelectMode == SelectMode.None)
                {
                    foreach (DrawObject o in MainController.Instance.GraphicModel.GrapList)
                    {
                        if (o.HitTest(e.Location) == 0)
                        {
                            //Ctrl 키가 눌러지지 않은 상태에서 DrawObject 를 선택하면 모든 DrawObjec의 선택을 해제하고 현재 DrawObject 를 선택한다.
                            if ((Control.ModifierKeys & Keys.Control) == 0 && !o.Selected)
                            {
                                this.UnSelectAll();
                                o.Selected = true;
                            }
                            else if ((Control.ModifierKeys & Keys.Control) != 0 && o.Selected)
                            {
                                //이미 선택된 DrawObject 라면 선택을 해제한다.
                                o.Selected = false;
                            }
                            else
                            {
                                //Ctrl 키가 눌러진 상태라면 기존 선택을 해제하지 않고 추가로 현재 DrawObject 를 선택한다.
                                o.Selected = true;
                            }

                            //마우스 커서를 바꿔준다.
                            this.Cursor = Cursors.SizeAll;

                            //DrawBox 상태를 이동으로 변경한다.
                            MainController.Instance.SelectMode = SelectMode.Move;

                            break;
                        }
                    }
                }

                //DrawBox 의 상태가 아무것도 지정되지 않고 키보드를 누른 상태가 아니라면 DrawBox 에 선택된 모든 객체를 해제한다.
                if (MainController.Instance.SelectMode == SelectMode.None)
                {
                    if ((Control.ModifierKeys & Keys.Control) == 0)
                    {
                        this.UnSelectAll();
                    }

                    //DrawBox 의 상태를 영역으로 선택하기로 변경한다.
                    MainController.Instance.SelectMode = SelectMode.NetSelection;
                }

                //현재의 마우스 위치를 저장한다.
                this.mLastPoint  = e.Location;
                this.mStartPoint = e.Location;

                //마우스를 캡쳐한다.
                this.Capture = true;

                //DrawBox의 상태가 영역으로 선택하기 일떄, 영역 그리기를 시작한다.
                if (MainController.Instance.SelectMode == SelectMode.NetSelection)
                {
                    ControlPaint.DrawReversibleFrame(this.RectangleToScreen(RectangleObject.GetNormalizedRectangle(this.mStartPoint, this.mLastPoint)), Color.Black, FrameStyle.Dashed);
                }
            }

            //마우스의 왼쪽을 클릭하고, DrawObjectType 이 선택하기가 아니라면 선택 DrawObject 를 그리기 시작한다.
            else if (e.Button == MouseButtons.Left && !(MainController.Instance.DrawObjectType == DrawObjectType.Select))
            {
                //모든 DrawObject 선택 해제
                this.UnSelectAll();

                //현재 상태를 실행취소(Undo) & 다시실행(Redo) Command 에 등록한다.
                MainController.Instance.Command.AddCommand(MainController.Instance.GraphicModel.GrapList);

                //새로운 DrawObject 를 GrapList 에 등록한다.
                MainController.Instance.GraphicModel.GrapList.Insert(0, this.AddNewDrawObject(MainController.Instance.DrawObjectType, e.Location));

                //마우스를 캡쳐한다.
                this.Capture = true;
            }

            //마우스 우클릭시 팝업 메뉴를 보여준다.
            else if (e.Button == System.Windows.Forms.MouseButtons.Right)
            {
                this.SetToolStripMenu();

                this.contextMenuStrip1.Show(MousePosition);

                return;
            }
        }