为你的CheckBox和RadioButton控件添色加彩

作者: 孟宪会 出自: 【孟宪会之精彩世界】 发布日期: 2003-8-6 18:20:00

通过扩展现有的CheckBox和RadioButton控件,可以把这些控件的外观改变不同的颜色,下面就是一个简单的例子。

首先建立ColorCheckControl工程,添加两个控件类:

ColoredCheckBox.cs

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace ColorCheckControl
{
    /// <summary>
    /// ColoredCheckBox 的摘要说明。
    /// </summary>
    public class ColoredCheckBox : CheckBox
    {
        //添加自定义颜色属性
        private Color checkColor;
        public Color checkBGColor;

        public ColoredCheckBox()
        {
            this.checkColor = this.ForeColor;
            this.Paint += new PaintEventHandler(this.PaintHandler);
        }

        [Description("checkColor由于显示在CheckBox选中时的颜色")]
        public Color CheckColor
        {
            get
            {
                return checkColor;
            }
            set
            {
                checkColor = value;
                this.Invalidate();
            }
        }

        public Color checkBgColor
        {
            get
            {
                return checkBGColor;
            }
            set
            {
                checkBGColor = value;
            }
        }

        private void PaintHandler(object sender, PaintEventArgs pe)
        {

            Point pt = new Point();

            if (this.CheckAlign == ContentAlignment.BottomCenter)
            {
                pt.X = (this.Width / 2) - 4;
                pt.Y = this.Height - 11;
            }
            if (this.CheckAlign == ContentAlignment.BottomLeft)
            {
                pt.X = 3;
                pt.Y = this.Height - 11;
            }
            if (this.CheckAlign == ContentAlignment.BottomRight)
            {
                pt.X = this.Width - 11;
                pt.Y = this.Height - 11;
            }
            if (this.CheckAlign == ContentAlignment.MiddleCenter)
            {
                pt.X = (this.Width / 2) - 4;
                pt.Y = (this.Height / 2) - 4;
            }
            if (this.CheckAlign == ContentAlignment.MiddleLeft)
            {
                pt.X = 3;
                pt.Y = (this.Height / 2) - 4;
            }
            if (this.CheckAlign == ContentAlignment.MiddleRight)
            {
                pt.X = this.Width - 11;
                pt.Y = (this.Height / 2) - 4;
            }
            if (this.CheckAlign == ContentAlignment.TopCenter)
            {
                pt.X = (this.Width / 2) - 4;
                pt.Y = 3;
            }
            if (this.CheckAlign == ContentAlignment.TopLeft)
            {
                pt.X = 3;
                pt.Y = 3;
            }
            if (this.CheckAlign == ContentAlignment.TopRight)
            {
                pt.X = this.Width - 11;
                pt.Y = 3;
            }

            DrawBackColor(pe.Graphics, this.checkBGColor, pt);
            if (this.Checked) DrawCheck(pe.Graphics, this.checkColor, pt);
        }

        public void DrawCheck(Graphics g, Color c, Point pt)
        {
            Pen pen = new Pen(this.checkColor);
            g.DrawLine(pen, pt.X, pt.Y + 2, pt.X + 2, pt.Y + 4);
            g.DrawLine(pen, pt.X, pt.Y + 3, pt.X + 2, pt.Y + 5);
            g.DrawLine(pen, pt.X, pt.Y + 4, pt.X + 2, pt.Y + 6);
            g.DrawLine(pen, pt.X + 3, pt.Y + 3, pt.X + 6, pt.Y);
            g.DrawLine(pen, pt.X + 3, pt.Y + 4, pt.X + 6, pt.Y + 1);
            g.DrawLine(pen, pt.X + 3, pt.Y + 5, pt.X + 6, pt.Y + 2);
        }

        public void DrawBackColor(Graphics g, Color b, Point pt)
        {
            SolidBrush br = new SolidBrush(this.checkBgColor);
            g.FillRectangle(br, pt.X, pt.Y, 7, 7);
        }
    }
}

ColoredRadioButton.cs

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace ColorCheckControl
{
    /// <summary>
    /// ColoredRadioButton 的摘要说明。
    /// </summary>
    public class CustomColorRadioButton : RadioButton
    {
        private Color checkColor;

        public CustomColorRadioButton()
        {
            this.checkColor = this.ForeColor;
            this.Paint += new PaintEventHandler(this.PaintHandler);
        }

        [Description("The color used to display the check painted in the RadioButton")]
        public Color CheckColor
        {
            get
            {
                return checkColor;
            }
            set
            {
                checkColor = value;
                this.Invalidate();
            }
        }

        private void PaintHandler(object sender, PaintEventArgs pe)
        {
            if (this.Checked)
            {
                Point pt = new Point();

                if (this.CheckAlign == ContentAlignment.BottomCenter)
                {
                    pt.X = (this.Width / 2) - 3;
                    pt.Y = this.Height - 9;
                }
                if (this.CheckAlign == ContentAlignment.BottomLeft)
                {
                    pt.X = 4;
                    pt.Y = this.Height - 9;
                }
                if (this.CheckAlign == ContentAlignment.BottomRight)
                {
                    pt.X = this.Width - 9;
                    pt.Y = this.Height - 9;
                }
                if (this.CheckAlign == ContentAlignment.MiddleCenter)
                {
                    pt.X = (this.Width / 2) - 3;
                    pt.Y = (this.Height / 2) - 3;
                }
                if (this.CheckAlign == ContentAlignment.MiddleLeft)
                {
                    pt.X = 4;
                    pt.Y = (this.Height / 2) - 3;
                }
                if (this.CheckAlign == ContentAlignment.MiddleRight)
                {
                    pt.X = this.Width - 9;
                    pt.Y = (this.Height / 2) - 3;
                }
                if (this.CheckAlign == ContentAlignment.TopCenter)
                {
                    pt.X = (this.Width / 2) - 3;
                    pt.Y = 4;
                }
                if (this.CheckAlign == ContentAlignment.TopLeft)
                {
                    pt.X = 4;
                    pt.Y = 4;
                }
                if (this.CheckAlign == ContentAlignment.TopRight)
                {
                    pt.X = this.Width - 9;
                    pt.Y = 4;
                }

                DrawCheck(pe.Graphics, this.checkColor, pt);
            }
        }

        public void DrawCheck(Graphics g, Color c, Point pt)
        {
            Pen pen = new Pen(this.checkColor);
            g.DrawLine(pen, pt.X, pt.Y + 1, pt.X + 3, pt.Y + 1);
            g.DrawLine(pen, pt.X, pt.Y + 2, pt.X + 3, pt.Y + 2);
            g.DrawLine(pen, pt.X + 1, pt.Y, pt.X + 1, pt.Y + 3);
            g.DrawLine(pen, pt.X + 2, pt.Y, pt.X + 2, pt.Y + 3);
        }
    }
}

然后建立表单Form1,代码如下:

Form1.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace ColorCheckControl
{
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private ColorCheckControl.ColoredCheckBox checkBox1;
        private ColorCheckControl.ColoredCheckBox checkBox2;
        private ColorCheckControl.CustomColorRadioButton radioButton1;
        private ColorCheckControl.CustomColorRadioButton radioButton2;
        private System.Windows.Forms.LinkLabel linkLabel1;
        /// <summary>
        /// 必需的设计器变量。
        /// </summary> 
        private System.ComponentModel.Container components = null;
        public Form1()
        {
            //
            // Windows 窗体设计器支持所必需的
            //
            InitializeComponent();
        }

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary> 
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary> 
        private void InitializeComponent()
        {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
            this.checkBox1 = new ColorCheckControl.ColoredCheckBox();
            this.checkBox2 = new ColorCheckControl.ColoredCheckBox();
            this.radioButton1 = new ColorCheckControl.CustomColorRadioButton();
            this.radioButton2 = new ColorCheckControl.CustomColorRadioButton();
            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
            this.SuspendLayout();
            // 
            // checkBox1
            // 
            this.checkBox1.checkBgColor = System.Drawing.Color.LimeGreen;
            this.checkBox1.CheckColor = System.Drawing.Color.Red;
            this.checkBox1.Checked = true;
            this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
            this.checkBox1.Location = new System.Drawing.Point(60, 64);
            this.checkBox1.Name = "checkBox1";
            this.checkBox1.Size = new System.Drawing.Size(224, 24);
            this.checkBox1.TabIndex = 1;
            this.checkBox1.Text = "扩展的CheckBox类:彩色CheckBox";
            // 
            // checkBox2
            // 
            this.checkBox2.checkBgColor = System.Drawing.Color.SkyBlue;
            this.checkBox2.CheckColor = System.Drawing.Color.Red;
            this.checkBox2.Checked = true;
            this.checkBox2.CheckState = System.Windows.Forms.CheckState.Checked;
            this.checkBox2.Location = new System.Drawing.Point(60, 96);
            this.checkBox2.Name = "checkBox2";
            this.checkBox2.Size = new System.Drawing.Size(224, 24);
            this.checkBox2.TabIndex = 2;
            this.checkBox2.Text = "扩展的CheckBox类:彩色CheckBox";
            // 
            // radioButton1
            // 
            this.radioButton1.CheckColor = System.Drawing.Color.Red;
            this.radioButton1.Checked = true;
            this.radioButton1.Location = new System.Drawing.Point(60, 8);
            this.radioButton1.Name = "radioButton1";
            this.radioButton1.Size = new System.Drawing.Size(224, 24);
            this.radioButton1.TabIndex = 3;
            this.radioButton1.TabStop = true;
            this.radioButton1.Text = "扩展的RadioButton类:彩色单选框";
            // 
            // radioButton2
            // 
            this.radioButton2.CheckColor = System.Drawing.Color.Blue;
            this.radioButton2.Location = new System.Drawing.Point(60, 32);
            this.radioButton2.Name = "radioButton2";
            this.radioButton2.Size = new System.Drawing.Size(224, 24);
            this.radioButton2.TabIndex = 4;
            this.radioButton2.Text = "扩展的RadioButton类:彩色单选框";
            // 
            // linkLabel1
            // 
            this.linkLabel1.LinkArea = new System.Windows.Forms.LinkArea(0, 100);
            this.linkLabel1.Location = new System.Drawing.Point(108, 128);
            this.linkLabel1.Name = "linkLabel1";
            this.linkLabel1.Size = new System.Drawing.Size(128, 23);
            this.linkLabel1.TabIndex = 5;
            this.linkLabel1.TabStop = true;
            this.linkLabel1.Text = "【孟宪会之精彩世界】";
            this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.ClientSize = new System.Drawing.Size(344, 157);
            this.Controls.Add(this.linkLabel1);
            this.Controls.Add(this.radioButton2);
            this.Controls.Add(this.radioButton1);
            this.Controls.Add(this.checkBox2);
            this.Controls.Add(this.checkBox1);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.Name = "Form1";
            this.Text = "为你的CheckBox和RadioButton控件增色加彩";
            this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
            this.ResumeLayout(false);
        }
        #endregion

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        /// 
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            System.Diagnostics.Process.Start("IExplore.exe", "http://xml.sz.luohuedu.net");
        }
    }
}

运行结果如下:

img_1

Contributors: FHL