Files

140 lines
4.3 KiB
C#
Raw Permalink Normal View History

2026-09-09 19:21:21 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
namespace JinYuan.ControlLib
{
public partial class CheckBoxExt : CheckBox
{
public CheckBoxExt()
{
InitializeComponent();
_format.LineAlignment=StringAlignment.Center;
_format.Alignment=StringAlignment.Center;
//设置控件样式,去除缓冲
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
}
private StringFormat _format = new StringFormat();
private int defultCheckButtonWidth=20;
[Browsable(true)]//是否可见
[Category("自定义属性")] //类别
[Description("设置或显示标题名称")]
public int DefultCheckButtonWidth
{
get { return defultCheckButtonWidth; }
set { defultCheckButtonWidth= value; }
}
private Color checkColor=Color.FromArgb(3,25,66);
[Browsable(true)]//是否可见
[Category("自定义属性")] //类别
[Description("设置或显示选中颜色")]
public Color CheckColor
{
get { return checkColor; }
set
{
checkColor = value;
this.Invalidate();
}
}
private Color checkBackColor = Color.White;
[Browsable(true)]//是否可见
[Category("自定义属性")] //类别
[Description("设置或显示选中框背景颜色")]
public Color CheckBackColor
{
get { return checkBackColor; }
set
{
checkBackColor = value;
this.Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
base.OnPaintBackground(e);
Graphics g = e.Graphics;
g.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.TextRenderingHint=System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
Rectangle checkRec;
Rectangle textRec;
CalculatorRec(out checkRec,out textRec);
SolidBrush solidBrush = new SolidBrush(CheckBackColor);
g.FillRectangle(solidBrush, checkRec);
Pen pen=new Pen(Color.LightGray);
g.DrawRectangle(pen, checkRec);
if (this.CheckState==CheckState.Checked)
{
//画勾选
DrawCheckFlag(g, checkRec,checkColor);
}
//绘制文本
g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), textRec, this._format);
}
/// <summary>
/// 计算矩形
/// </summary>
/// <param name="checkRec"></param>
/// <param name="textRec"></param>
private void CalculatorRec(out Rectangle checkRec, out Rectangle textRec)
{
checkRec = new Rectangle(3,(this.Height - defultCheckButtonWidth) / 2, defultCheckButtonWidth,
defultCheckButtonWidth);
textRec = new Rectangle(checkRec.Right+3,0,Width-checkRec.Right-6,this.Height);
}
/// <summary>
/// 画勾选
/// </summary>
/// <param name="g"></param>
/// <param name="rectangle"></param>
/// <param name="color"></param>
private void DrawCheckFlag(Graphics g,Rectangle rectangle,Color color)
{
PointF[] pointFs = new PointF[3];
pointFs[0] = new PointF(rectangle.X+rectangle.Width/4.5f,rectangle.Y+rectangle.Height/2.5f);
pointFs[1] = new PointF(rectangle.X + rectangle.Width / 2.5F, rectangle.Bottom - rectangle.Height / 3.0f);
pointFs[2] = new PointF(rectangle.Right-rectangle.Width/4.0f, rectangle.Y+rectangle.Height/4.5f);
Pen pen = new Pen(color,2.0f);
g.DrawLines(pen, pointFs);
}
}
}