SplitContainer扩展可以关闭左边

public class SplitContainerEx : SplitContainer
    {
        const int _SplitWide = 19;
        const int _SplitHeight = _SplitWide * 3;

        bool m_IsCollpase = false;
        Rectangle rect = new Rectangle();
        bool m_IsInRect = false;
        int m_SplitLocate;

        Bitmap m_bmp=null, m_bmpbck;

        private bool IsInRect
        {
            get
            {
                return m_IsInRect;
            }
            set
            {
                if (value)
                {//MoveEnter
                    this.Cursor = Cursors.Hand;
                    //prj.Win32.User32.SetCapture(this.Handle);
                    Capture = true;
                }
                else
                {//MoveOut
                    this.Cursor = Cursors.Default;
                    //User32.ReleaseCapture();
                    Capture = false;
                }
                m_IsInRect = value;
            }
        }

        public bool IsCollpase
        {
            get { return m_IsCollpase; }
            set {
                if (value)
                {
                    m_SplitLocate = this.SplitterDistance;
                    this.SplitterDistance = Panel1MinSize;
                }
                else
                {
                    this.SplitterDistance = m_SplitLocate;
                }

                m_IsCollpase = value;
                RotateBmp();
            }
        }

        new public Orientation Orientation
        {
            get { return base.Orientation; }
            set
            {
                base.Orientation = value;
                RotateBmp();
            }
        }

        public SplitContainerEx()
        {
            this.SplitterWidth = 9;
            this.Panel1MinSize = 0;
            m_bmpbck = CreateCollapseImage();
            RotateBmp();
        }

        protected override void Dispose(bool disposing)
        {
            if (m_bmp != null)
                m_bmp.Dispose();
            base.Dispose(disposing);
        }

        private void RotateBmp()
        {
            if (m_bmp != null)
                m_bmp.Dispose();
            m_bmp = (Bitmap)m_bmpbck.Clone();
            if (this.Orientation == System.Windows.Forms.Orientation.Horizontal)
                m_bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
            if (m_IsCollpase)
                m_bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);

        }

        private void GetSplitBmpRect()
        {
            if (this.Orientation == Orientation.Vertical)
            {
                rect.X = this.SplitterDistance;
                rect.Y = this.Height <= _SplitHeight ? 0 : (this.Height - _SplitHeight) / 2;
                rect.Width = this.SplitterWidth;
                rect.Height = this.SplitterWidth*3;
            }
            else
            {
                rect.X = this.Width <= _SplitHeight ? 0 : (this.Width - _SplitHeight) / 2;
                rect.Y = this.SplitterDistance;
                rect.Width = this.SplitterWidth*3;
                rect.Height = this.SplitterWidth;
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            GetSplitBmpRect();

            e.Graphics.SetClip(rect);
            e.Graphics.Clear(this.BackColor);
            //绘制
            GraphicsUnit unit = GraphicsUnit.Pixel;
            e.Graphics.DrawImage(m_bmp, rect, m_bmp.GetBounds(ref unit), GraphicsUnit.Pixel);            

            base.OnPaint(e);
        }

        private bool MouseInRectBound(Point p)
        {
            if (rect.Contains(p))
            {
                if (!m_IsInRect)
                    IsInRect = true;
            }
            else if (m_IsInRect)
                IsInRect = false;
            return false;
        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (!rect.Contains(e.Location))
                base.OnMouseDown(e);//把事件吃掉
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
            MouseInRectBound(e.Location);
            base.OnMouseMove(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (rect.Contains(e.Location))
            {
                IsCollpase = !m_IsCollpase;
                IsInRect = false;
                return;
            }
            base.OnMouseClick(e);
        }

        private Bitmap CreateCollapseImage()
        {
            Bitmap bmp = new Bitmap(_SplitWide, _SplitHeight);

            for (int i = 0; i < _SplitHeight - 5; i += 5)
            {
                for (int j = 0; j < _SplitWide - 3; j += 3)
                {
                    bmp.SetPixel(j,i, Color.Black);
                }
            }

            int p = (_SplitHeight - _SplitWide) / 2, q = p + _SplitWide;

            using (Graphics dc = Graphics.FromImage(bmp))
            {
                Point point1 = new Point(0, p + _SplitWide / 2);
                Point point2 = new Point(_SplitWide - 1, p);
                Point point3 = new Point(_SplitWide - 1, q);
                Point[] curvePoints = { point1, point2, point3 };

                // Define fill mode.
                System.Drawing.Drawing2D.FillMode newFillMode = System.Drawing.Drawing2D.FillMode.Winding;

                dc.FillPolygon(Brushes.Black, curvePoints, newFillMode);
            }
            return bmp;
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值