public HCFloatLineItem(HCCustomData AOwnerData) : base(AOwnerData)
 {
     this.StyleNo  = HCFloatStyle.Line;
     FMouseDownObj = HCLineObj.cloNone;
     Width         = 100;
     Height        = 70;
     FStartPt      = new POINT(0, 0);
     FEndPt        = new POINT(Width, Height);
 }
        public override void MouseMove(MouseEventArgs e)
        {
            if (Active)
            {
                if (this.Resizing)
                {
                    if (FMouseDownObj == HCLineObj.cloLeftOrTop)
                    {
                        FStartPt.Offset(e.X - this.FResizeX, e.Y - this.FResizeY);
                    }
                    else
                    {
                        FEndPt.Offset(e.X - this.FResizeX, e.Y - this.FResizeY);
                    }

                    this.FResizeX = e.X;
                    this.FResizeY = e.Y;

                    HC.GCursor = Cursors.Cross;
                }
                else
                {
                    HCLineObj vLineObj = GetLineObjAt(e.X, e.Y);
                    if ((vLineObj == HCLineObj.cloLeftOrTop) || (vLineObj == HCLineObj.cloRightOrBottom))
                    {
                        HC.GCursor = Cursors.Cross;
                    }
                    else
                    if (vLineObj != HCLineObj.cloNone)
                    {
                        HC.GCursor = Cursors.SizeAll;
                    }
                }
            }
            else
            {
                HC.GCursor = Cursors.Default;
            }
        }
        public override void MouseDown(MouseEventArgs e)
        {
            if (Active)
            {
                FMouseDownObj = GetLineObjAt(e.X, e.Y);
                this.Resizing = (e.Button == MouseButtons.Left) &&
                                ((FMouseDownObj == HCLineObj.cloLeftOrTop) || (FMouseDownObj == HCLineObj.cloRightOrBottom));
                if (this.Resizing)
                {
                    this.FResizeX = e.X;
                    this.FResizeY = e.Y;
                    // 缩放前的Rect的LeftTop
                    if (FStartPt.X < FEndPt.X)
                    {
                        FLeftTop.X = FStartPt.X;
                    }
                    else
                    {
                        FLeftTop.X = FEndPt.X;
                    }

                    if (FStartPt.Y < FEndPt.Y)
                    {
                        FLeftTop.Y = FStartPt.Y;
                    }
                    else
                    {
                        FLeftTop.Y = FEndPt.Y;
                    }
                }
            }
            else
            {
                FMouseDownObj = HCLineObj.cloNone;
                Active        = PtInClient(e.X, e.Y);
            }
        }
        private HCLineObj GetLineObjAt(int X, int Y)
        {
            HCLineObj Result = HCLineObj.cloNone;

            if (HC.PtInRect(new RECT(FStartPt.X - PointSize, FStartPt.Y - PointSize, FStartPt.X + PointSize, FStartPt.Y + PointSize), new POINT(X, Y)))
            {
                Result = HCLineObj.cloLeftOrTop;
            }
            else
            if (HC.PtInRect(new RECT(FEndPt.X - PointSize, FEndPt.Y - PointSize, FEndPt.X + PointSize, FEndPt.Y + PointSize), new POINT(X, Y)))
            {
                Result = HCLineObj.cloRightOrBottom;
            }
            else
            {
                POINT[] vPointArr = new POINT[4];
                vPointArr[0] = new POINT(FStartPt.X - PointSize, FStartPt.Y);
                vPointArr[1] = new POINT(FStartPt.X + PointSize, FStartPt.Y);
                vPointArr[2] = new POINT(FEndPt.X + PointSize, FEndPt.Y);
                vPointArr[3] = new POINT(FEndPt.X - PointSize, FEndPt.Y);
                IntPtr vRgn = (IntPtr)GDI.CreatePolygonRgn(ref vPointArr[0], 4, GDI.WINDING);
                try
                {
                    if (GDI.PtInRegion(vRgn, X, Y) > 0)
                    {
                        Result = HCLineObj.cloLine;
                    }
                }
                finally
                {
                    GDI.DeleteObject(vRgn);
                }
            }

            return(Result);
        }