返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现自定义单选和复选按钮样式
  • 974
分享到

C#实现自定义单选和复选按钮样式

摘要

目录实践过程效果代码实践过程 效果 代码 public partial class GlorifyCheckBox : CheckBox { public

实践过程

效果

代码

public partial class GlorifyCheckBox : CheckBox
    {
        public GlorifyCheckBox()
        {
            InitializeComponent();
            FontAspect = getAspect(); //获取当前控件文本的读取方向
        }

        #region 变量

        private bool FontAspect = false; //判断字体的方向
        private int Measurement = 255; //设置渐变的初始值
        LinearGradientBrush Periphery_br; //外圆的颜色
        LinearGradientBrush Central_br; //移入控件时中圆的颜色
        LinearGradientBrush NoCentral_br; //无操作时中圆的颜色

        #endregion

        #region 添加属性

        public enum StyleSort
        {
            Null = 0, //无
            Integer = 1, //整数
            Decimal = 2, //小数
        }

        private Color TPeripheryColor = Color.DarkBlue;

        [Browsable(true), CateGory("设置填充颜色"), Description("外圆的颜色")] //在“属性”窗口中显示DataStyle属性
        public Color PeripheryColor
        {
            get { return TPeripheryColor; }
            set
            {
                TPeripheryColor = value;
                this.Invalidate();
            }
        }

        private Color TCentralColor = Color.CornflowerBlue;

        [Browsable(true), Category("设置填充颜色"), Description("移入控件时中圆的颜色")] //在“属性”窗口中显示DataStyle属性
        public Color CentralColor
        {
            get { return TCentralColor; }
            set
            {
                TCentralColor = value;
                this.Invalidate();
            }
        }

        private Color TNoCentralColor = Color.PowderBlue;

        [Browsable(true), Category("设置填充颜色"), Description("无操作时中圆的颜色")] //在“属性”窗口中显示DataStyle属性
        public Color NoCentralColor
        {
            get { return TNoCentralColor; }
            set
            {
                TNoCentralColor = value;
                this.Invalidate();
            }
        }

        private Color TStippleColor = Color.DarkBlue;

        [Browsable(true), Category("设置填充颜色"), Description("选中后内圆的颜色")] //在“属性”窗口中显示DataStyle属性
        public Color StippleColor
        {
            get { return TStippleColor; }
            set
            {
                TStippleColor = value;
                this.Invalidate();
            }
        }

        #endregion

        #region 事件

        /// <summary>
        /// 控件在需要重绘时触发
        /// </summary>
        protected override void OnPaint(System.windows.FORMs.PaintEventArgs e)
        {
            e.Graphics.FillRectangle(SystemBrushes.Control, e.ClipRectangle); //填充矩形
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //清除锯齿
            //获取左面图标的区域
            Rectangle boxrect = new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y,
                SystemInformation.SmallIconSize.Width, e.ClipRectangle.Height);
            //获取绘制的文本的区域
            Rectangle strrect = new Rectangle(e.ClipRectangle.X + SystemInformation.SmallIconSize.Width,
                e.ClipRectangle.Y, e.ClipRectangle.Width + 5 - SystemInformation.SmallIconSize.Width,
                e.ClipRectangle.Height);
            if (FontAspect) //判断字体的读取方式
            {
                boxrect.X = e.ClipRectangle.X + e.ClipRectangle.Width - SystemInformation.SmallIconSize.Width; //设置椭圆的位置
                strrect.X = e.ClipRectangle.X; //设置字体位置
            }

            Point MousePos = this.PointToClient(Control.MousePosition); //获取鼠标的位置
            bool Above = e.ClipRectangle.Contains(MousePos); //获取鼠标是否在当前控件上

            DrawBox(e.Graphics, boxrect, Above); //绘制单选图案
            DrawText(e.Graphics, strrect); //绘制文字
            if (!Enabled)
                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(127, SystemColors.Control)), e.ClipRectangle);
        }

        /// <summary>
        /// 鼠标移入控件的可见区域时触发
        /// </summary>
        protected override void OnMouseEnter(System.EventArgs e)
        {
            base.OnMouseEnter(e);
            this.Invalidate();
        }

        /// <summary>
        /// 鼠标移出控件的可见区域时触发
        /// </summary>
        protected override void OnMouseLeave(System.EventArgs e)
        {
            base.OnMouseLeave(e);
            this.Invalidate();
        }

        /// <summary>
        /// RightToLeft属性值更改时发生
        /// </summary>
        protected override void OnRightToLeftChanged(System.EventArgs e)
        {
            base.OnRightToLeftChanged(e);
            FontAspect = getAspect();
            this.Invalidate();
        }

        #endregion

        #region 方法

        /// <summary>
        /// 绘制单选控件的图案
        /// </summary>
        /// <param g="Graphics">封装一个绘图的类对象</param>
        /// <param rect="Rectangle">单选图案的绘制区域</param> 
        /// <param Above="bool">断判鼠标是否在控件上方</param> 
        private void DrawBox(Graphics g, Rectangle rect, bool Above)
        {
            //设置外椭圆的渐变色
            int opacity = Measurement;
            Periphery_br = new LinearGradientBrush(rect, Color.FromArgb(opacity / 2, PeripheryColor),
                Color.FromArgb(opacity, PeripheryColor), LinearGradientMode.ForwardDiagonal);
            //设置中间椭圆形选中时的渐变色
            opacity = (int) (.4f * opacity + .5f);
            Central_br = new LinearGradientBrush(rect, Color.FromArgb(opacity / 10, CentralColor),
                Color.FromArgb(opacity, CentralColor), LinearGradientMode.ForwardDiagonal);
            //设置中间椭圆形无操作时的渐变色
            opacity = (int) (.4f * opacity + .5f);
            NoCentral_br = new LinearGradientBrush(rect, Color.FromArgb(opacity / 10, NoCentralColor),
                Color.FromArgb(opacity, NoCentralColor), LinearGradientMode.ForwardDiagonal);
            int size = this.Font.Height; //获取字体的高度
            //获取外椭圆的区域
            Rectangle box = new Rectangle(rect.X + ((rect.Width - size) / 2), rect.Y + ((rect.Height - size) / 2),
                size - 2, size - 2);
            Rectangle glyph = new Rectangle(box.X + 3, box.Y + 3, box.Width - 6, box.Height - 6); //设置内圆的绘制区域
            Rectangle right = new Rectangle(box.X, box.Y - 1, box.Width + 2, box.Height + 2);
            g.FillEllipse(new SolidBrush(SystemColors.Window), box); //以白色填充单选图案 

            if (this.CheckState != CheckState.Unchecked) //如果是选中状态
            {
                base.ForeColor = Color.DarkBlue;
                ControlPaint.DrawMenuGlyph(g, right, MenuGlyph.Checkmark, this.StippleColor, Color.White); //绘制对号
                g.DrawRectangle(new Pen(new SolidBrush(SystemColors.Control), (float) (3)), box); //绘制外椭圆
            }

            if (this.CheckState == CheckState.Indeterminate)
                g.FillRectangle(new SolidBrush(Color.FromArgb(127, SystemColors.Control)), right);

            if (Above && this.Enabled) //如果鼠标移入该控件
            {
                g.DrawRectangle(new Pen(Central_br, 2),
                    new Rectangle(box.X + 2, box.Y + 2, box.Width - 4, box.Height - 4)); //绘制中心椭圆
            }
            else
            {
                g.DrawRectangle(new Pen(NoCentral_br, 2),
                    new Rectangle(box.X + 2, box.Y + 2, box.Width - 4, box.Height - 4)); //绘制中心椭圆
            }

            g.DrawRectangle(new Pen(Periphery_br, (float) (1.5)), box); //绘制外椭圆
        }

        /// <summary>
        /// 绘制文本
        /// </summary>
        /// <param g="Graphics">封装一个绘图的类对象</param>
        /// <param rect="Rectangle">绘制文本的区域</param>
        private void DrawText(Graphics g, Rectangle rect)
        {
            StringFormat tem_StringF = new StringFormat();
            tem_StringF.Alignment = StringAlignment.Near;
            tem_StringF.LineAlignment = StringAlignment.Center; //文本居中对齐
            if (FontAspect)
                tem_StringF.FormatFlags = StringFormatFlags.DirectionRightToLeft; //按从左到右的顺序显示文本
            //g.DrawString(this.Text, this.Font, SystemBrushes.ControlText, rect, tem_StringF);//绘制文本
            if (!FontAspect)
                g.DrawString(this.Text, this.Font, SystemBrushes.ControlText, rect, tem_StringF); //绘制文本
            else
            {
                rect.X = rect.X - SystemInformation.SmallIconSize.Width / 2 + 2;
                g.DrawString(this.Text, this.Font, SystemBrushes.ControlText, rect, tem_StringF);
            }
        }

        /// <summary>
        /// 获取文本的读取方向
        /// </summary>
        /// <return>布尔型</return>
        private bool getAspect()
        {
            bool tem_Aspect = SystemInformation.RightAlignedMenus;
            if (this.RightToLeft == RightToLeft.Yes) //从右到左进行读取
                tem_Aspect = true;
            if (this.RightToLeft == RightToLeft.No) //从左到右进行读取
                tem_Aspect = false;
            return tem_Aspect;
        }

        #endregion
    }

到此这篇关于C#实现自定义单选和复选按钮样式的文章就介绍到这了,更多相关C#自定义按钮样式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#实现自定义单选和复选按钮样式

本文链接: https://lsjlt.com/news/175638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#实现自定义单选和复选按钮样式
    目录实践过程效果代码实践过程 效果 代码 public partial class GlorifyCheckBox : CheckBox { public ...
    99+
    2022-12-23
    C#自定义单选按钮样式 C#自定义复选按钮样式 C#自定义按钮样式 C# 按钮
  • CSS中怎么自定义绿色复选框按钮样式
    本篇文章给大家分享的是有关CSS中怎么自定义绿色复选框按钮样式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 首先想到的是, 复选框...
    99+
    2024-04-02
  • Android自定义View实现拖动选择按钮
    本文为大家分享了Android实现拖动选择按钮的具体代码,供大家参考,具体内容如下 效果图 View代码 第一步:自定义属性 <declare-styleable ...
    99+
    2022-06-06
    view 选择 按钮 Android
  • Vue怎么实现多选和单选按钮
    这篇“Vue怎么实现多选和单选按钮”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue怎么实现多选和单选按钮”文章吧。多选按...
    99+
    2023-07-05
  • Android实现单选按钮
    本文实例为大家分享了Android实现单选按钮的具体代码,供大家参考,具体内容如下 单选按钮 在默认情况下,单选按钮显示为一个圆形图标,可以在图标旁放一些说明文字。通常情况下Radi...
    99+
    2024-04-02
  • 微信小程序自定义单选框样式实现单选功能
    本文实例为大家分享了微信小程序自定义单选框样式实现单选功能的具体代码,供大家参考,具体内容如下 实现效果: 选择小车时,其他类型的车取消选中。 具体思路: 用数组存几种类型车的数据...
    99+
    2024-04-02
  • HTML单选和多选按钮怎么给图片加样式
    本文小编为大家详细介绍“HTML单选和多选按钮怎么给图片加样式”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML单选和多选按钮怎么给图片加样式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • Android编程如何实现带有单选按钮和复选按钮的dialog功能
    这篇文章将为大家详细讲解有关Android编程如何实现带有单选按钮和复选按钮的dialog功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:带有单选按钮的dialog:package ...
    99+
    2023-05-30
    android dialog
  • Android studio实现单选按钮
    本文实例为大家分享了Android studio实现单选按钮的具体代码,供大家参考,具体内容如下 创建空activity编辑activity_main.xml文件 代码如下: <...
    99+
    2024-04-02
  • 如何使用CSS3美化单选、复选按钮的显示样式
    这篇文章将为大家详细讲解有关如何使用CSS3美化单选、复选按钮的显示样式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图如下实例代码<!DOCTYPE ...
    99+
    2024-04-02
  • vue 表格单选按钮的实现方式
    目录vue实现表格单选按钮表格中有两个单选按钮切换互不影响项目场景问题描述原因分析解决方案vue实现表格单选按钮 return{ orderNo:'', columns: [ ...
    99+
    2024-04-02
  • Android怎么实现单选按钮
    这篇文章主要介绍了Android怎么实现单选按钮的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现单选按钮文章都会有所收获,下面我们一起来看看吧。单选按钮在默认情况下,单选按钮显示为一个圆形图...
    99+
    2023-06-30
  • CSS单选按钮怎么实现
    本文小编为大家详细介绍“CSS单选按钮怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS单选按钮怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单选按钮因为box-shadow会按比例缩放,因此...
    99+
    2023-07-04
  • C#如何实现自定义圆角按钮
    这篇文章给大家分享的是有关C#如何实现自定义圆角按钮的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮。...
    99+
    2023-06-25
  • 使用:checked伪类选择器改变选中复选框或单选按钮的样式
    因为文章长度有限,所以只有简短的代码示例。下面是一个例子:假设我们有以下HTML结构:<!DOCTYPE html> <html lang="en"> <head> <met...
    99+
    2023-11-20
    selector style :checked
  • css怎么自定义radio单选框样式
    今天小编给大家分享一下css怎么自定义radio单选框样式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2024-04-02
  • 详解Android自定义view如何实现拖拽选择按钮
    小编这次要给大家分享的是详解Android自定义view如何实现拖拽选择按钮,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。本文实例为大家分享了Android实现拖拽选择按钮的具体代码,供大家参考,具体...
    99+
    2023-05-30
    android view roi
  • C#实现自定义圆角按钮的方法
    Winform中自带的button没有圆角属性,所以我们继承Button类,重写OnPaint事件来绘制圆角按钮。 1.绘制圆角按钮框需要用到系统自带的绘制方法:首先引入Gdi32....
    99+
    2024-04-02
  • css3圆角样式中自定义按钮样式是怎样的
    css3圆角样式中自定义按钮样式是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。代码如下:<div class=&...
    99+
    2024-04-02
  • Android单选按钮RadioButton怎么实现
    这篇文章主要介绍Android单选按钮RadioButton怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!单选按钮要在一组中选择一项,并且不能多选。同一组RadioButton要放在同一个RadioGroup...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作