C# 重绘checkbox生成滑动开关
通过调用checkbox控件的paint事件,在重绘事件里判断checked属性,如果选中绘制选中图形,如果未选中绘制未选中图形。
效果图:
绘制圆角矩形方法:
/// <summary>/// 填充圆角矩形/// </summary>/// <param name="g"></param>/// <param name="brush"></param>/// <param name="rect"></param>/// <param name="cornerRadius"></param>publicstaticvoidFillRoundRectangle(Graphics g,Brush brush,Rectangle rect,int cornerRadius){using(GraphicsPath path=CreateRoundedRectanglePath(rect, cornerRadius)){
g.FillPath(brush, path);}}/// <summary>/// 圆角矩形路径/// </summary>/// <param name="rect"></param>/// <param name="cornerRadius"></param>/// <returns></returns>internalstaticGraphicsPathCreateRoundedRectanglePath(Rectangle rect,int cornerRadius){GraphicsPath roundedRect=newGraphicsPath();
roundedRect.AddArc(rect.X, rect.Y, cornerRadius*2, cornerRadius*2,180,90);
roundedRect.AddLine(rect.X+ cornerRadius, rect.Y, rect.Right- cornerRadius*2, rect.Y);
roundedRect.AddArc(rect.X+ rect.Width- cornerRadius*2, rect.Y, cornerRadius*2, cornerRadius*2,270,90);
roundedRect.AddLine(rect.Right, rect.Y+ cornerRadius*2, rect.Right, rect.Y+ rect.Height- cornerRadius*2);
roundedRect.AddArc(rect.X+ rect.Width- cornerRadius*2, rect.Y+ rect.Height- cornerRadius*2, cornerRadius*2, cornerRadius*2,0,90);
roundedRect.AddLine(rect.Right- cornerRadius*2, rect.Bottom, rect.X+ cornerRadius*2, rect.Bottom);
roundedRect.AddArc(rect.X, rect.Bottom- cornerRadius*2, cornerRadius*2, cornerRadius*2,90,90);
roundedRect.AddLine(rect.X, rect.Bottom- cornerRadius*2, rect.X, rect.Y+ cornerRadius*2);
roundedRect.CloseFigure();return roundedRect;}
重绘代码:
privatevoidRectangleCheckBoxButton(object sender,PaintEventArgs e){CheckBox rButton=(CheckBox)sender;Graphics g= e.Graphics;
g.Clear(this.BackColor);Rectangle RoundRect=newRectangle(0,0,50,30);
g.SmoothingMode= SmoothingMode.AntiAlias;//FillRoundRectangle(g, Brushes.White, radioButtonrect, 15);if(rButton.Checked){Color color=Color.FromArgb(55,197,90);Brush b1=newSolidBrush(color);FillRoundRectangle(g, b1, RoundRect,15);using(Pen pen=newPen(Color.FromArgb(255,255,255))){FillRoundRectangle(g, Brushes.White,newRectangle(22,2,26,26),13);}}else{using(Pen pen=newPen(Color.FromArgb(255,255,255))){FillRoundRectangle(g, Brushes.Silver, RoundRect,15);FillRoundRectangle(g,Brushes.White,newRectangle(2,2,26,26),13);}}Font f=newFont("微软雅黑",12);
g.DrawString(((CheckBox)sender).Text,f, Brushes.White,newPointF(60,6));}
调用:
privatevoidcheckBox1_Paint(object sender,PaintEventArgs e){RectangleCheckBoxButton(sender, e);}