博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重写Checkbox 改写选择框的大小
阅读量:7218 次
发布时间:2019-06-29

本文共 13410 字,大约阅读时间需要 44 分钟。

/* 作者:Starts_2000     * 日期:2009-07-30     * 网站:http://www.csharpwin.com CS 程序员之窗。     * 你可以免费使用或修改以下代码,但请保留版权信息。     * 具体请查看 CS程序员之窗开源协议(http://www.csharpwin.com/csol.html)。     */    [ToolboxBitmap(typeof(CheckBox))]    public class CheckBoxEx : CheckBox    {        private Color _baseColor = Color.FromArgb(51, 161, 224);        private ControlState _controlState;        private static readonly ContentAlignment RightAlignment =            ContentAlignment.TopRight |            ContentAlignment.BottomRight |            ContentAlignment.MiddleRight;        private static readonly ContentAlignment LeftAligbment =            ContentAlignment.TopLeft |            ContentAlignment.BottomLeft |            ContentAlignment.MiddleLeft;        public CheckBoxEx()            : base()        {            SetStyle(                ControlStyles.UserPaint |                ControlStyles.AllPaintingInWmPaint |                ControlStyles.OptimizedDoubleBuffer |                ControlStyles.ResizeRedraw |                ControlStyles.SupportsTransparentBackColor, true);        }        public Color BaseColor        {            get { return _baseColor; }            set            {                _baseColor = value;                base.Invalidate();            }        }        protected virtual int DefaultCheckButtonWidth        {            get { return 30; }        }        internal ControlState ControlState        {            get { return _controlState; }            set            {                if (_controlState != value)                {                    _controlState = value;                    base.Invalidate();                }            }        }        protected override void OnMouseEnter(EventArgs e)        {            base.OnMouseEnter(e);            ControlState = ControlState.Hover;        }        protected override void OnMouseLeave(EventArgs e)        {            base.OnMouseLeave(e);            ControlState = ControlState.Normal;        }        protected override void OnMouseDown(MouseEventArgs e)        {            base.OnMouseDown(e);            if (e.Button == MouseButtons.Left && e.Clicks == 1)            {                ControlState = ControlState.Pressed;            }        }        protected override void OnMouseUp(MouseEventArgs e)        {            base.OnMouseUp(e);            if (e.Button == MouseButtons.Left && e.Clicks == 1)            {                if (ClientRectangle.Contains(e.Location))                {                    ControlState = ControlState.Hover;                }                else                {                    ControlState = ControlState.Normal;                }            }        }        protected override void OnPaint(PaintEventArgs e)        {            base.OnPaint(e);            base.OnPaintBackground(e);            Graphics g = e.Graphics;            Rectangle checkButtonRect;            Rectangle textRect;            CalculateRect(out checkButtonRect, out textRect);            g.SmoothingMode = SmoothingMode.AntiAlias;            Color backColor = ControlPaint.Light(_baseColor);            Color borderColor;            Color innerBorderColor;            Color checkColor;            bool hover = false;            if (Enabled)            {                switch (ControlState)                {                    case ControlState.Hover:                        borderColor = _baseColor;                        innerBorderColor = _baseColor;                        checkColor = GetColor(_baseColor, 0, 35, 24, 9);                        hover = true;                        break;                    case ControlState.Pressed:                        borderColor = _baseColor;                        innerBorderColor = GetColor(_baseColor, 0, -13, -8, -3);                        checkColor = GetColor(_baseColor, 0, -35, -24, -9);                        hover = true;                        break;                    default:                        borderColor = _baseColor;                        innerBorderColor = Color.Empty;                        checkColor = _baseColor;                        break;                }            }            else            {                borderColor = SystemColors.ControlDark;                innerBorderColor = SystemColors.ControlDark;                checkColor = SystemColors.ControlDark;            }            using (SolidBrush brush = new SolidBrush(Color.White))            {                g.FillRectangle(brush, checkButtonRect);            }            if (hover)            {                using (Pen pen = new Pen(innerBorderColor, 2F))                {                    g.DrawRectangle(pen, checkButtonRect);                }            }            switch (CheckState)            {                case CheckState.Checked:                    DrawCheckedFlag(                        g,                        checkButtonRect,                        checkColor);                    break;                case CheckState.Indeterminate:                    checkButtonRect.Inflate(-1, -1);                    using (GraphicsPath path = new GraphicsPath())                    {                        path.AddEllipse(checkButtonRect);                        using (PathGradientBrush brush = new PathGradientBrush(path))                        {                            brush.CenterColor = checkColor;                            brush.SurroundColors = new Color[] { Color.White };                            Blend blend = new Blend();                            blend.Positions = new float[] { 0f, 0.4f, 1f };                            blend.Factors = new float[] { 0f, 0.3f, 1f };                            brush.Blend = blend;                            g.FillEllipse(brush, checkButtonRect);                        }                    }                    checkButtonRect.Inflate(1, 1);                    break;            }            using (Pen pen = new Pen(borderColor))            {                g.DrawRectangle(pen, checkButtonRect);            }            Color textColor = Enabled ? ForeColor : SystemColors.GrayText;            TextRenderer.DrawText(                g,                Text,                Font,                textRect,                textColor,                GetTextFormatFlags(TextAlign, RightToLeft == RightToLeft.Yes));        }        private void CalculateRect(             out Rectangle checkButtonRect, out Rectangle textRect)        {            checkButtonRect = new Rectangle(                0, 0, DefaultCheckButtonWidth, DefaultCheckButtonWidth);            textRect = Rectangle.Empty;            bool bCheckAlignLeft = (int)(LeftAligbment & CheckAlign) != 0;            bool bCheckAlignRight = (int)(RightAlignment & CheckAlign) != 0;            bool bRightToLeft = RightToLeft == RightToLeft.Yes;            if ((bCheckAlignLeft && !bRightToLeft) ||                (bCheckAlignRight && bRightToLeft))            {                switch (CheckAlign)                {                    case ContentAlignment.TopRight:                    case ContentAlignment.TopLeft:                        checkButtonRect.Y = 2;                        break;                    case ContentAlignment.MiddleRight:                    case ContentAlignment.MiddleLeft:                        checkButtonRect.Y = (Height - DefaultCheckButtonWidth) / 2;                        break;                    case ContentAlignment.BottomRight:                    case ContentAlignment.BottomLeft:                        checkButtonRect.Y = Height - DefaultCheckButtonWidth - 2;                        break;                }                checkButtonRect.X = 1;                textRect = new Rectangle(                    checkButtonRect.Right + 2,                    0,                    Width - checkButtonRect.Right - 4,                    Height);            }            else if ((bCheckAlignRight && !bRightToLeft)                || (bCheckAlignLeft && bRightToLeft))            {                switch (CheckAlign)                {                    case ContentAlignment.TopLeft:                    case ContentAlignment.TopRight:                        checkButtonRect.Y = 2;                        break;                    case ContentAlignment.MiddleLeft:                    case ContentAlignment.MiddleRight:                        checkButtonRect.Y = (Height - DefaultCheckButtonWidth) / 2;                        break;                    case ContentAlignment.BottomLeft:                    case ContentAlignment.BottomRight:                        checkButtonRect.Y = Height - DefaultCheckButtonWidth - 2;                        break;                }                checkButtonRect.X = Width - DefaultCheckButtonWidth - 1;                textRect = new Rectangle(                    2, 0, Width - DefaultCheckButtonWidth - 6, Height);            }            else            {                switch (CheckAlign)                {                    case ContentAlignment.TopCenter:                        checkButtonRect.Y = 2;                        textRect.Y = checkButtonRect.Bottom + 2;                        textRect.Height = Height - DefaultCheckButtonWidth - 6;                        break;                    case ContentAlignment.MiddleCenter:                        checkButtonRect.Y = (Height - DefaultCheckButtonWidth) / 2;                        textRect.Y = 0;                        textRect.Height = Height;                        break;                    case ContentAlignment.BottomCenter:                        checkButtonRect.Y = Height - DefaultCheckButtonWidth - 2;                        textRect.Y = 0;                        textRect.Height = Height - DefaultCheckButtonWidth - 6;                        break;                }                checkButtonRect.X = (Width - DefaultCheckButtonWidth) / 2;                textRect.X = 2;                textRect.Width = Width - 4;            }        }        private void DrawCheckedFlag(Graphics graphics, Rectangle rect, Color color)        {            PointF[] points = new PointF[3];            points[0] = new PointF(                rect.X + rect.Width / 4.5f,                rect.Y + rect.Height / 2.5f);            points[1] = new PointF(                rect.X + rect.Width / 2.5f,                rect.Bottom - rect.Height / 3f);            points[2] = new PointF(                rect.Right - rect.Width / 4.0f,                rect.Y + rect.Height / 4.5f);            using (Pen pen = new Pen(color, 2F))            {                graphics.DrawLines(pen, points);            }        }        private Color GetColor(Color colorBase, int a, int r, int g, int b)        {            int a0 = colorBase.A;            int r0 = colorBase.R;            int g0 = colorBase.G;            int b0 = colorBase.B;            if (a + a0 > 255) { a = 255; } else { a = Math.Max(a + a0, 0); }            if (r + r0 > 255) { r = 255; } else { r = Math.Max(r + r0, 0); }            if (g + g0 > 255) { g = 255; } else { g = Math.Max(g + g0, 0); }            if (b + b0 > 255) { b = 255; } else { b = Math.Max(b + b0, 0); }            return Color.FromArgb(a, r, g, b);        }        internal static TextFormatFlags GetTextFormatFlags(            ContentAlignment alignment,            bool rightToleft)        {            TextFormatFlags flags = TextFormatFlags.WordBreak |                TextFormatFlags.SingleLine;            if (rightToleft)            {                flags |= TextFormatFlags.RightToLeft | TextFormatFlags.Right;            }            switch (alignment)            {                case ContentAlignment.BottomCenter:                    flags |= TextFormatFlags.Bottom | TextFormatFlags.HorizontalCenter;                    break;                case ContentAlignment.BottomLeft:                    flags |= TextFormatFlags.Bottom | TextFormatFlags.Left;                    break;                case ContentAlignment.BottomRight:                    flags |= TextFormatFlags.Bottom | TextFormatFlags.Right;                    break;                case ContentAlignment.MiddleCenter:                    flags |= TextFormatFlags.HorizontalCenter |                        TextFormatFlags.VerticalCenter;                    break;                case ContentAlignment.MiddleLeft:                    flags |= TextFormatFlags.VerticalCenter | TextFormatFlags.Left;                    break;                case ContentAlignment.MiddleRight:                    flags |= TextFormatFlags.VerticalCenter | TextFormatFlags.Right;                    break;                case ContentAlignment.TopCenter:                    flags |= TextFormatFlags.Top | TextFormatFlags.HorizontalCenter;                    break;                case ContentAlignment.TopLeft:                    flags |= TextFormatFlags.Top | TextFormatFlags.Left;                    break;                case ContentAlignment.TopRight:                    flags |= TextFormatFlags.Top | TextFormatFlags.Right;                    break;            }            return flags;        }    }    ///     /// 控件的状态。    ///     internal enum ControlState    {        ///         ///  正常。        ///         Normal,        ///         /// 鼠标进入。        ///         Hover,        ///         /// 鼠标按下。        ///         Pressed,        ///         /// 获得焦点。        ///         Focused,    }

 

转载于:https://www.cnblogs.com/08shiyan/p/4942787.html

你可能感兴趣的文章
Web Services 入门(之二)
查看>>
随机模拟MCMC和Gibbs Sampling
查看>>
网络安全是一种态度
查看>>
POJ1131 Octal Fractions
查看>>
mysql-ulogd2.sql
查看>>
119. Pascal's Triangle II - Easy
查看>>
349. Intersection of Two Arrays - Easy
查看>>
[算法练习]最长公共子串(LCS)
查看>>
p转c++
查看>>
树(tree)
查看>>
codevs——2645 Spore
查看>>
ssh服务之 远程登录和端口转发
查看>>
java环境配置正确,但是tomcat不能启动的解决办法
查看>>
我就是想找个人聊聊天,说说我这近四年来的经历
查看>>
不同的测试方法使用的场景
查看>>
Hadoop快速入门
查看>>
Problem S
查看>>
SVN上传的时候没法显示文件名,只显示后缀名
查看>>
Python:pygame游戏编程之旅四(游戏界面文字处理)
查看>>
fedroa 编译安装mysql5.5
查看>>