重写Checkbox 改写选择框的大小

    /* 作者: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;}}/// <summary>/// 控件的状态。/// </summary>internal enum ControlState{/// <summary>///  正常。/// </summary>
        Normal,/// <summary>/// 鼠标进入。/// </summary>
        Hover,/// <summary>/// 鼠标按下。/// </summary>
        Pressed,/// <summary>/// 获得焦点。/// </summary>
        Focused,}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU4349--Xiao Ming's Hope(数论)

输入一个n(1<n<108)&#xff0c;求C(n,0),C(n,1),C(n,2)...C(n,n)有多少个奇数。 Lacus定理 http://blog.csdn.net/acm_cxlove/article/details/7844973 A、B是非负整数&#xff0c;p是质数。AB写成p进制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。…

[react] react中可以在render访问refs吗?为什么?

[react] react中可以在render访问refs吗&#xff1f;为什么&#xff1f; <><span id"name" ref{this.spanRef}>{this.state.title}</span><span >{this.spanRef.current ? 有值 : 无值}</span></> 不可以&#xff0c;render …

JS splice()方法

splice() 方法用于插入、删除或替换数组的元素。 语法 arrayObject.splice(index,howmany,element1,.....,elementX) 参数 描述 index 必需。规定从何处添加/删除元素。 该参数是开始插入和&#xff08;或&#xff09;删除的数组元素的下标&#xff0c;必须是数字。 howmany…

为什么每天感觉没精神

有些朋友会总是感觉没有精神&#xff0c;整天困得睁不开眼&#xff0c;干什么都没有劲儿&#xff0c;休息又睡不好&#xff0c;该怎么办呢&#xff1f;早睡早起。虽然都是每天睡8小时&#xff0c;但是早睡早起的人明显比晚睡晚起的人充满了正能量。要相信大自然的力量&#xff…

[react-router] React-Router怎么获取历史对象?

[react-router] React-Router怎么获取历史对象&#xff1f; 1.如果React > 16.8 时可以使用 React Router中提供的Hooksimport { useHistory } from "react-router-dom";let history useHistory(); 2.使用this.props.history获取历史对象let history this.pr…

为Ubuntu Server 安装图形桌面环境

From: http://www.oschina.net/question/12_10835 第一步&#xff1a;安装桌面环境 首先需要确保您已经在/etc/apt/sources.list 文件中启用了Universe和Multiverse软件库&#xff0c;接下来执行如下命令&#xff1a; sudo apt-get update sudo apt-get install ubuntu-desk…

使用STM32的USB模块中后对USB缓冲区的认识

最近在使用STM32的USB模块开发个项目&#xff0c;还以为挺简单&#xff0c;结果搞了快两天才把USB的包缓冲区的访问搞定&#xff0c;在此做个小总结吧。 STM32的USB模块包缓冲区有512B&#xff0c;但是在STM32的参考手册中的存储器映像中却表明0x40006000-0x400063ff&#xff0…

md /mdd /ml /mt/mtd

From: http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) C 运行时库 库文件 Single thread(static link) ML libc.lib Debug single …

[react] 在react中怎样改变组件状态,以及状态改变的过程是什么?

[react] 在react中怎样改变组件状态&#xff0c;以及状态改变的过程是什么&#xff1f; 使用this.setState改变组件的状态改变的过程中&#xff0c;React Fiber Reconciler遍历了整个Fiber Tree&#xff0c;得到了最新的DOM diff结果&#xff0c;并把这个结果应用到真实的DOM上…

web前端实战系列[1]——三列布局

1.代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Cont…

[react] react是什么?它的主要特点是什么?

[react] react是什么&#xff1f;它的主要特点是什么&#xff1f; React是用于构建用户界面的库。 特点&#xff1a; 组件化,增强复用性数据到视图的单向绑定,更安全数据的单项传递流高性能个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff…

Unix整理笔记-vi简介-里程碑M8

1 vi是Unix/Linx工程师必备的 2 ~表示是未使用的行&#xff0c;如果某行不是以~开头&#xff0c;并且仍然是空白的&#xff0c;那么一定存在空格&#xff0c;制表符&#xff0c;换行符等 3 vi区别大小写 4 在vi中搜索文件&#xff0c;命令模式下&#xff1a;/yourword 5 如果进…

android Sqlite小记

1、android.database.sqlite.SQLiteException: near "": syntax error (code 1): 语法错误&#xff0c;如果你的报了这个错误,就好好看下你的sql语句吧 比如,下边这句&#xff1a;&#xff0c;如果你不注意&#xff0c;可能会觉得没错 1 ss "ss:42--56,10--11…

[react] 你用过react版本有哪些?

[react] 你用过react版本有哪些&#xff1f; react17.0.2 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Ext JS 4.1 RC1发布

下载地址&#xff1a;http://cdn.sencha.com/ext-4.1-rc1.zip Bugs Fixed for RC1Button EXTJSIV-5129 - Button does not adhere to width setting in IE9Charts EXTJSIV-4416 - Chart label misaligned on numeric x axisEXTJSIV-5459 - Setting markers to be hidden in ren…

修改linux默认启动级别(包括Ubuntu)

From: http://xinchibaobei.blog.163.com/blog/static/126392509200910101356215/ 说明&#xff1a;本文后半篇引用crazy365的文章&#xff0c;可能是大部分linux版本的设置方式&#xff0c;但在Ubuntu下不适用。 所以搜寻了Ubuntu下的修改方式&#xff0c;稍作整理放在前面…

iSensor APP 之 摄像头调试 OV3640 OV2640 MT9d112

iSensor app 非常适合调试各种摄像头&#xff0c;已测试通过的sensor有&#xff1a; l OV7670、OV7725、OV9650、OV9655、OV9653、OV5642、OV5640 l MT9T001、MT9M001、MT9P031 今天又测试了上述几款新的型号&#xff0c;之前并未用过。 OV3640 OV2640 MT9d112 先看OV2640&am…

[react-router] React-Router怎么获取URL的参数?

[react-router] React-Router怎么获取URL的参数&#xff1f; 通过params 类组件&#xff1a;在保证props能获取到路由信息的前提下&#xff08;如果不是直接嵌套在<Route/>下&#xff0c;需要使用withRouter的HOC&#xff09;&#xff0c;通过this.props.match.params获…

LINUX下查看CPU使用率的命令

From: http://www.cnblogs.com/Wen-Man/archive/2011/04/04/2373771.html 1.top 使用权限&#xff1a;所有使用者 使用方式&#xff1a;top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明&#xff1a;即时显示process的动态 d :改变显示的更新速度&#xff0c;或是在交…