// Mouse is moved.
        // None button is pressed, ot left button is pressed.
        public override void OnMouseMove(Canvas drawArea, MouseEventArgs e)
        {
            Point point = drawArea.BackTrackMouse(new Point(e.X, e.Y));

            wasMove = true;
            if (e.Button == MouseButtons.None)
            {
                Cursor cursor = Cursors.Default;
                for (int i = drawArea.Document.Count - 1; i >= 0; i--)
                {
                    int n = drawArea.Document[i].HitTest(point);
                    if (n > 0)
                    {
                        cursor = drawArea.Document[i].GetHandleCursor(n);
                        break;
                    }
                }

                drawArea.Cursor = cursor;
                return;
            }

            if (e.Button != MouseButtons.Left)
            {
                return;
            }

            if (point.X < 0)
            {
                point.X = 0;
            }
            if (point.X > drawArea.Width)
            {
                point.X = drawArea.Width;
            }

            if (point.Y < 0)
            {
                point.Y = 0;
            }
            if (point.Y > drawArea.Height)
            {
                point.Y = drawArea.Height;
            }

            if (lastPoint.X < 0)
            {
                lastPoint.X = 0;
            }
            if (lastPoint.X > drawArea.Width)
            {
                lastPoint.X = drawArea.Width;
            }

            if (lastPoint.Y < 0)
            {
                point.Y = 0;
            }
            if (lastPoint.Y > drawArea.Height)
            {
                lastPoint.Y = drawArea.Height;
            }


            // Left button is pressed
            // Find difference between previous and current position
            int dx = point.X - lastPoint.X;
            int dy = point.Y - lastPoint.Y;


            //加快移动速度
            int zoom = drawArea.MessageControl != null ?drawArea.MessageControl.Zoom : 6;

            if (Math.Abs(dx) < zoom && Math.Abs(dy) < zoom)
            {
                return;
            }

            int xOffset = dx % zoom;
            int yOffset = dy % zoom;

            if (xOffset != 0 || yOffset % zoom != 0)
            {
                dx -= xOffset;
                dy -= yOffset;
            }

            if (!ClampCanvas(drawArea, point))
            {
                return;
            }
            lastPoint = point;

            xOffset = point.X % zoom;
            yOffset = point.Y % zoom;
            if (xOffset != 0 || yOffset != 0)
            {
                if (xOffset <= zoom / 2)
                {
                    point.X -= xOffset;
                }
                else
                {
                    point.X = point.X + zoom - xOffset;
                }

                if (yOffset <= zoom / 2)
                {
                    point.Y -= yOffset;
                }
                else
                {
                    point.Y = point.Y + zoom - yOffset;
                }
            }


            // resize
            if (selectMode == SelectionMode.Size)
            {
                if (resizedObject != null)
                {
                    //if (resizedObject.Type == ShapeType.Text)
                    //{
                    //    ((ShapeLabel)resizedObject).FrameSizeFixed = true;
                    //}

                    if (resizedObject.Type != ShapeType.Line)
                    {
                        switch (resizedObjectHandle)
                        {
                        case 1:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 2:
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 3:
                            if (point.X <= resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            if (point.Y >= resizedObject.VirtualBounds.Bottom)
                            {
                                point.Y = resizedObject.VirtualBounds.Bottom - zoom;
                            }
                            break;

                        case 4:
                            if (point.X < resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            break;

                        case 5:
                            if (point.X <= resizedObject.VirtualBounds.Left)
                            {
                                point.X = resizedObject.VirtualBounds.Left + zoom;
                            }
                            if (point.Y <= resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 6:
                            if (point.Y <= resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 7:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            if (point.Y < resizedObject.VirtualBounds.Top)
                            {
                                point.Y = resizedObject.VirtualBounds.Top + zoom;
                            }
                            break;

                        case 8:
                            if (point.X >= resizedObject.VirtualBounds.Right)
                            {
                                point.X = resizedObject.VirtualBounds.Right - zoom;
                            }
                            break;

                        default:
                            break;
                        }
                        lastPoint = point;
                    }

                    resizedObject.MoveHandleTo(point, resizedObjectHandle);

                    drawArea.Document.ChangedService.MarkChanged();

                    if (resizedObject is ShapeLine)
                    {
                        lastPoint = resizedObject.GetHandle(resizedObjectHandle);
                    }

                    drawArea.Refresh();
                }
            }

            // move
            if (selectMode == SelectionMode.Move)
            {
                int movecount = 0;
                foreach (ShapeBase sb in drawArea.Document.SelectedShapes)
                {
                    if (sb.IsBackground)
                    {
                        continue;
                    }
                    movecount++;
                    sb.Move(dx, dy);
                }
                if (movecount > 0)
                {
                    drawArea.Document.ChangedService.MarkChanged();
                }

                drawArea.Cursor = Cursors.SizeAll;
                drawArea.Refresh();
            }

            if (selectMode == SelectionMode.NetSelection)
            {
                drawArea.NetRectangle = ShapeControlPaintNew.GetNormalizedRectangle(startPoint, lastPoint);
                drawArea.Refresh();
                return;
            }
        }