private void PaintPanel_MouseDown(object sender, MouseEventArgs e)
        {
            if (_myData.Count() == 0)
            {
                undo.Clear();
            }
  
            if (!_isFill)
            {
                f = new Point();
                myPaint.FirstPoint = myPaint.SecondPoint = e.Location;
                
                /////

                //
                if (myPaint.ShapeType1 != ShapeType.MyEraser)
                {
                    myPaint.TextLocation = e.Location;
                    //Xác định bao khung để xem thử có đang ở chế độ Resize không

                    Point Start = new Point();
                    Point End = new Point();
                    if (_myData.Count() > 0)
                    {
                        MyShape temp = _myData[_myData.Count() - 1];
                        temp.findBourder(ref Start, ref End);
                    }

                    // Bỏ hình viền bao quanh hình vừa mới vẽ
                    int n = _myData.Count();
                    if (n > 0 && _myData[n - 1].State.ShapeType1 != ShapeType.MyText && !_isRemoveBorder)
                    {
                        _myData.RemoveAt(n - 1);
                        n--;
                        _isRemoveBorder = true;
                      
                    }

                    //Giữ lại điểm đầu của hình cho chức năng resize đường thẳng
                    if (n > 0)
                    {
                        f = new Point(_myData[n - 1].State.SecondPoint.X, _myData[n - 1].State.SecondPoint.Y);
                    }


                    bool flag = false;
                    if (n > 0 && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyEraser && _isStillCanReSize)
                    {
                        flag = findReSizePoint(e.Location, Start, End, _myData[_myData.Count() - 1].State.FirstPoint, _myData[_myData.Count() - 1].State.SecondPoint);
                    }
                    // Nếu không ở chế độ resize
                    if (!flag)
                    {

                        _isReSizePoint = new bool[8] { false, false, false, false, false, false, false, false };
                        _isReSize = false;

                        if (n > 0 && _myData[_myData.Count() - 1].State.ShapeType1 == ShapeType.MyText
                            && textBox.Text != "")
                        {
                            _myData[_myData.Count() - 1].State.Text = textBox.Text;
                            _myData[_myData.Count() - 1].State.TextLocation = textBox.Location;
                            _myData[_myData.Count() - 1].State.TextSize = (int) textBox.Font.Size;
                            _myData[_myData.Count() - 1].State.TextFont = textBox.Font.Name.ToString();
                            _myData[_myData.Count() - 1].State.CurrentColor = textBox.ForeColor;
                            this.Invalidate();
                        }

                        // Xóa đi các textbox
                        this.Controls.Clear();
                        textBox = new TextBox();

                        if (_isStillCanMove)
                        {
                            //Nếu không phải là đường thẳng thì xét điểm click nằm trong bao khung
                            if (n > 0 && _myData[n - 1].State.ShapeType1 == ShapeType.MyLine)
                            {
                                if (_myData[n - 1].calcDistanceLine(e.Location) < 5)
                                {
                                    _isCanMove = true;
                                    
                                }
                                else
                                {
                                    _isCanMove = false;
                                }

                            }
                            //Nếu là đường thẳng thì xét khoảng cách từ điểm click đến đường thẳng đó nhỏ hơn < Epxelon ( 5 )
                            else
                            {
                                if (n > 0 && _myData[n - 1].State.ShapeType1 != ShapeType.MyEraser && _myData[n - 1].checkPointInside(e.Location))// Nếu đang nằm trong vùng của hình mới vẽ thì kích hoạt trạng thái di chuyển
                                {
                                    _isCanMove = true;
                                }
                            }

                            if (_isCanMove)
                            {
                                int dentaX = myPaint.SecondPoint.X - myPaint.FirstPoint.X;
                                int dentaY = myPaint.SecondPoint.Y - myPaint.FirstPoint.Y;

                                PaintState temp1 = new PaintState(myPaint);
                                MyShape a;
                                switch (myPaint.ShapeType1)
                                {
                                    case ShapeType.MyLine:
                                        a = new MyLine(temp1);
                                        break;
                                    case ShapeType.MyRectangle:
                                        a = new MyRectangle(temp1);
                                        break;
                                    case ShapeType.MyEllipse:
                                        a = new MyEllipse(temp1);
                                        break;
                                    case ShapeType.MyTriangle:
                                        a = new MyTriangle(temp1);
                                        break;
                                    default:
                                        a = new MyLine(temp1);
                                        break;
                                }

                                a.State.FirstPoint = new Point(_myData[n - 1].State.FirstPoint.X + dentaX, _myData[n - 1].State.FirstPoint.Y + dentaY);
                                a.State.SecondPoint = new Point(_myData[n - 1].State.SecondPoint.X + dentaX, _myData[n - 1].State.SecondPoint.Y + dentaY);
                                a.State.Shift1 = _myData[n - 1].State.Shift1;
                                _shapeCurrent = _myData[n - 1];
                                _myData[n - 1] = a;

                                this.Invalidate();
                            }


                           
                        }
                        // Nếu chưa có hình nào hoặc nằm ngoài hình vừa mới vẽ hoặc trạng thái có thể di chuyển bị tắt hoặc (hình trước đó là đường thẳng và không được bật trạng thái di chuyển ) thì tắt trạng thái di chuyển và bắt đầu thêm hình mới vào danh sách các hình
                        if (n == 0 || (n > 0 && !_myData[n - 1].checkPointInside(e.Location)) || (n > 0 && _myData[n - 1].checkPointInside(e.Location) && _myData[n - 1].State.ShapeType1 == ShapeType.MyLine && !_isCanMove) || !_isStillCanMove)
                        {
                            _isCanMove = false;

                            if (n > 0)
                            {
                                MyShape temp2 = _myData[_myData.Count() - 1];
                                byte[] buffer = temp2.State.ToByteArray();
                                if (_isClient && client != null && client.Connected)
                                {
                                    try
                                    {

                                        client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }
                                }

                                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                                {

                                    foreach (var item in _clientSocket)
                                    {
                                        item.Send(buffer);
                                    }

                                }
                            }
                            //Hình đầu tiên của các client trước ( n - 1 ) bị gới lên server bị mất nên phải gởi lại hình đầu tiên
                            if (n == 1)
                            {
                                MyShape temp3 = _myData[_myData.Count() - 1];
                                byte[] buffer = temp3.State.ToByteArray();
                                if (_isClient && client != null && client.Connected)
                                {
                                    try
                                    {

                                        client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                                    }
                                    catch (Exception ex)
                                    {
                                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }
                                }

                                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                                {

                                    foreach (var item in _clientSocket)
                                    {
                                        item.Send(buffer);
                                    }

                                }
                            }
                            PaintState t = new PaintState(myPaint);

                            MyShape a;
                            switch (myPaint.ShapeType1)
                            {
                                case ShapeType.MyLine:
                                    a = new MyLine(t);
                                    break;
                                case ShapeType.MyRectangle:
                                    a = new MyRectangle(t);
                                    break;
                                case ShapeType.MyEllipse:
                                    a = new MyEllipse(t);
                                    break;
                                case ShapeType.MyTriangle:
                                    a = new MyTriangle(t);
                                    break;
                                case ShapeType.MyText:                        
                                    a = new MyText(t);
                                    break;                                
                                default:
                                    a = new MyLine(t);
                                    break;
                            }

                            _myData.Add(a);

                            // Nếu đang ở trạng thái text thì thêm 1 khung hình 
                            if (myPaint.ShapeType1 == ShapeType.MyText)
                            {
                                MyRectangle x = new MyRectangle (myPaint);
                                x.State.CurrentColor = myPaint.CurrentColor;
                                x.State.LineWidth = 1;
                                x.State.NameBrush = "NoFill";
                                x.State.IsBrushFill = false;
                                _myData.Add(x);
                            }

                        }
                    }
                }
                else// Đang ở trạng thái xóa
                {
                    // Nếu trước đó đang ở trạng thái text thì lấy nội dung của text và xóa textbox đi
                    if (_myData.Count() > 0 && _myData[_myData.Count() - 1].State.ShapeType1 == ShapeType.MyText)
                    {
                        _myData[_myData.Count() - 1].State.Text = textBox.Text;
                        this.Invalidate();
                    }
                    // Xóa đi các textbox
                    this.Controls.Clear();
                    textBox = new TextBox();
                    //
                    // Nếu trước đó là một hình nào đó mà không phải là text hay border thì chắc chắn có bao khung --> xóa bao khung đi
                    if (_myData.Count() > 0 && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyText && _myData[_myData.Count() - 1].State.ShapeType1 != ShapeType.MyEraser)
                    {
                        _myData.RemoveAt(_myData.Count() - 1);
                    }
                    // Gởi hình vừa vẽ trước đó
                    if (_myData.Count() > 0)
                    {
                        MyShape temp = _myData[_myData.Count() - 1];
                        byte[] buffer = temp.State.ToByteArray();
                        if (_isClient && client != null && client.Connected)
                        {
                            try
                            {

                                client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }

                        if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                        {

                            foreach (var item in _clientSocket)
                            {
                                item.Send(buffer);
                            }

                        }
                    }
                    PaintState statetemp = new PaintState(myPaint);
                    MyShape a = new MyEraser(statetemp);
                    a.State.EraserPoint.Add(myPaint.FirstPoint);
                    _myData.Add(a);
                    this.Invalidate();
                }
              //
            }
            else //Trang thai tô
            {
                myPaint.FirstPoint = myPaint.SecondPoint = e.Location;

                // Nếu như đang network thì gởi hình vẽ trước đó đi
                if (_myData.Count() > 0)
                {
                    MyShape shapetemp = _myData[_myData.Count() - 1];
                    byte[] buffertemp = shapetemp.State.ToByteArray();
                    if (_isClient && client != null && client.Connected)
                    {
                        try
                        {
                            client.BeginSend(buffertemp, 0, buffertemp.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }

                    if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                    {

                        foreach (var item in _clientSocket)
                        {
                            item.Send(buffertemp);
                        }

                    }

                }           

                floodFill(e.Location,_fillColor);

                //Lưu dưới dạng đối tượng
                myPaint.PointFill = e.Location;
                myPaint.RF1 = _fillColor.R;
                myPaint.GF1 = _fillColor.G;
                myPaint.BF1 = _fillColor.B;
                PaintState t3 = new PaintState(myPaint);
                MyShape t1 = new MyFill(t3);
            
                _myData.Add(t1);
                ///

                //Gởi trạng thái tô

                byte[] buffer1 = t3.ToByteArray();
                if (_isClient && client != null && client.Connected)
                {
                    try
                    {
                        client.BeginSend(buffer1, 0, buffer1.Length, SocketFlags.None, new AsyncCallback(SendCallbackClient), null);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                if (_isServer) //Nếu đang với vai trò là sever thì gởi hình trên sever về tất cả người kết nối
                {

                    foreach (var item in _clientSocket)
                    {
                        item.Send(buffer1);
                    }

                }

            }

        }
예제 #2
0
        public void updateShape(MyShape shape, Color r)
        {
            shape.State.CurrentColor = r;
            shape.State.R1 = r.R;
            shape.State.G1 = r.G;
            shape.State.B1 = r.B;

        }
        private bool[] _isReSizePoint = new bool[8] { false, false, false, false, false, false, false, false };// Mảng lưu trạng thái resize tương ứng với 8 điểm điều khiển trên khung bao hình chữ nhật
        //0: Góc trái trên
        //1: Góc trái dưới
        //2: Góc phải trên
        //3: Góc phải dưới
        //4: Cạnh trên
        //5: Cạnh trái.
        //6: Cạnh dưới
        //7: Cạnh phải

        /// <summary>
        /// Hàm tính vị trí điểm điều khiển resize
        /// </summary>
        /// <param name="e">Vị trí điểm cần xét</param>
        /// <param name="Start">Góc trái trên của khung bao hình chữ nhật</param>
        /// <param name="End">Góc phải dưới của khung bao hình chữ nhật</param>
        /// <returns>Có nằm xung quanh 8 điểm điều khiển hay không</returns>
        public bool findReSizePoint(Point e, Point Start, Point End, Point first, Point last)
        {
            if (myPaint.ShapeType1 != ShapeType.MyLine)
            {
                if (Math.Abs(e.X - End.X) < 5 && (Math.Abs(e.Y - End.Y) < 5))
                {
                    _isReSize = true;
                    _isReSizePoint = new bool[8] { false, false, false, true, false, false, false, false };
                    _shapeCurrent = _myData[_myData.Count() - 1];
                    return true;
                }
                else
                {
                    if (Math.Abs(e.X - Start.X) < 5 && (Math.Abs(e.Y - Start.Y) < 5))
                    {
                        _shapeCurrent = _myData[_myData.Count() - 1];
                        _isReSize = true;
                        _isReSizePoint = new bool[8] { true, false, false, false, false, false, false, false };
                        return true;
                    }
                    else
                    {
                        if (Math.Abs(e.X - Start.X) < 5 && (Math.Abs(e.Y - End.Y) < 5))
                        {
                            _shapeCurrent = _myData[_myData.Count() - 1];
                            _isReSize = true;
                            _isReSizePoint = new bool[8] { false, true, false, false, false, false, false, false };
                            return true;
                        }
                        else
                        {
                            if (Math.Abs(e.X - End.X) < 5 && (Math.Abs(e.Y - Start.Y) < 5))
                            {
                                _shapeCurrent = _myData[_myData.Count() - 1];
                                _isReSize = true;
                                _isReSizePoint = new bool[8] { false, false, true, false, false, false, false, false };
                                return true;
                            }
                            else
                            {
                                if (Math.Abs(e.X - (End.X + Start.X) / 2) < 5 && (Math.Abs(e.Y - Start.Y) < 5))
                                {
                                    _shapeCurrent = _myData[_myData.Count() - 1];
                                    _isReSize = true;
                                    _isReSizePoint = new bool[8] { false, false, false, false, true, false, false, false };
                                    return true;
                                }
                                else
                                {
                                    if (Math.Abs(e.X - Start.X) < 5 && (Math.Abs(e.Y - (Start.Y + End.Y) / 2) < 5))
                                    {
                                        _shapeCurrent = _myData[_myData.Count() - 1];
                                        _isReSize = true;
                                        _isReSizePoint = new bool[8] { false, false, false, false, false, true, false, false };
                                        return true;
                                    }
                                    else
                                    {
                                        if (Math.Abs(e.X - (End.X + Start.X) / 2) < 5 && (Math.Abs(e.Y - End.Y) < 5))
                                        {
                                            _shapeCurrent = _myData[_myData.Count() - 1];
                                            _isReSize = true;
                                            _isReSizePoint = new bool[8] { false, false, false, false, false, false, true, false };
                                            return true;
                                        }
                                        else
                                        {
                                            if (Math.Abs(e.X - End.X) < 5 && (Math.Abs(e.Y - (Start.Y + End.Y) / 2) < 5))
                                            {
                                                _shapeCurrent = _myData[_myData.Count() - 1];
                                                _isReSize = true;
                                                _isReSizePoint = new bool[8] { false, false, false, false, false, false, false, true };
                                                return true;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                if (_myData.Count() > 0)
                {
                    if (Math.Abs(e.X - first.X) < 5 && (Math.Abs(e.Y - first.Y) < 5))
                    {
                        _isReSize = true;
                        _isReSizePoint = new bool[8] { true, false, false, false, false, false, false, false };
                        _shapeCurrent = _myData[_myData.Count() - 1];
                        return true;
                    }
                    else
                    {
                        if (Math.Abs(e.X - last.X) < 5 && (Math.Abs(e.Y - last.Y) < 5))
                        {
                            _shapeCurrent = _myData[_myData.Count() - 1];
                            _isReSize = true;
                            _isReSizePoint = new bool[8] { false, true, false, false, false, false, false, false };
                            return true;
                        }
                    }
                }

            }
            return false;

        }