@@ -23,29 +23,26 @@ public bool Checked
2323 get => _Checked == true ;
2424 set
2525 {
26- if ( _Checked == value ) return ;
26+ if ( _Checked == value ) return ;
2727 Image = SwitchImage ( value ) ;
28- if ( _Checked == null )
28+ if ( _Checked == null )
2929 {
3030 _Checked = value ;
3131 return ;
3232 }
33- if ( PreCheckChanging != null && ! PreCheckChanging . Invoke ( ) )
33+ if ( PreCheckChanging != null && ! PreCheckChanging . Invoke ( ) )
3434 {
3535 Image = SwitchImage ( ! value ) ;
3636 return ;
3737 }
38- else CheckChanging ? . Invoke ( ) ;
39- if ( PreCheckChanged != null && ! PreCheckChanged . Invoke ( ) )
38+ CheckChanging ? . Invoke ( ) ;
39+ if ( PreCheckChanged != null && ! PreCheckChanged . Invoke ( ) )
4040 {
4141 Image = SwitchImage ( ! value ) ;
4242 return ;
4343 }
44- else
45- {
46- _Checked = value ;
47- CheckChanged ? . Invoke ( ) ;
48- }
44+ _Checked = value ;
45+ CheckChanged ? . Invoke ( ) ;
4946 }
5047 }
5148
@@ -57,66 +54,80 @@ public bool Checked
5754 public Image TurnOnImage { get ; set ; } = TurnOn ;
5855 public Image TurnOffImage { get ; set ; } = TurnOff ;
5956
60- private Image SwitchImage ( bool value )
61- {
62- return value ? TurnOnImage : TurnOffImage ;
63- }
57+ private Image SwitchImage ( bool value ) => value ? TurnOnImage : TurnOffImage ;
6458
6559 protected override void OnMouseDown ( MouseEventArgs e )
6660 {
6761 base . OnMouseDown ( e ) ;
68- if ( e . Button == MouseButtons . Left ) Checked = ! Checked ;
62+ if ( e . Button == MouseButtons . Left ) Checked = ! Checked ;
6963 }
7064
7165 private static readonly Image TurnOn = DrawImage ( true ) ;
7266 private static readonly Image TurnOff = DrawImage ( false ) ;
7367
7468 private static Image DrawImage ( bool value )
7569 {
76- int w = 80 . DpiZoom ( ) ;
77- int r1 = 16 . DpiZoom ( ) ;
78- float r2 = 13F . DpiZoom ( ) ;
79- int d1 = r1 * 2 ;
80- float d2 = r2 * 2 ;
81- float a = r1 - r2 ;
82- Bitmap bitmap = new Bitmap ( w , d1 ) ;
83- using ( Graphics g = Graphics . FromImage ( bitmap ) )
70+ int w = 80 . DpiZoom ( ) , h = 40 . DpiZoom ( ) ;
71+ int r = h / 2 , padding = 4 . DpiZoom ( ) ;
72+ var bitmap = new Bitmap ( w , h ) ;
73+
74+ using ( Graphics g = Graphics . FromImage ( bitmap ) )
8475 {
8576 g . InterpolationMode = InterpolationMode . HighQualityBicubic ;
8677 g . CompositingQuality = CompositingQuality . HighQuality ;
8778 g . PixelOffsetMode = PixelOffsetMode . HighQuality ;
88- g . SmoothingMode = SmoothingMode . HighQuality ;
89- using ( GraphicsPath path = new GraphicsPath ( ) )
79+ g . SmoothingMode = SmoothingMode . AntiAlias ;
80+
81+ // 背景渐变
82+ using ( var bgPath = CreateRoundedRect ( 0 , 0 , w , h , r ) )
9083 {
91- path . AddArc ( new RectangleF ( 0 , 0 , d1 , d1 ) , 90 , 180 ) ;
92- path . AddLine ( new PointF ( r1 , 0 ) , new PointF ( w - r1 , 0 ) ) ;
93- path . AddArc ( new RectangleF ( w - d1 , 0 , d1 , d1 ) , - 90 , 180 ) ;
94- path . AddLine ( new PointF ( w - r1 , d1 ) , new PointF ( r1 , d1 ) ) ;
95- Color color = value ? MyMainForm . MainColor : Color . FromArgb ( 130 , 136 , 144 ) ; //Fixed color
96- using ( Brush brush = new SolidBrush ( color ) )
84+ Color startColor = value ? MyMainForm . MainColor : Color . FromArgb ( 200 , 200 , 200 ) ;
85+ Color endColor = value ? Color . FromArgb ( 160 , MyMainForm . MainColor . R , MyMainForm . MainColor . G , MyMainForm . MainColor . B ) :
86+ Color . FromArgb ( 160 , 160 , 160 ) ;
87+ using ( var bgBrush = new LinearGradientBrush ( new Rectangle ( 0 , 0 , w , h ) , startColor , endColor , 90f ) )
9788 {
98- g . FillPath ( brush , path ) ;
89+ g . FillPath ( bgBrush , bgPath ) ;
9990 }
10091 }
101- using ( GraphicsPath path = new GraphicsPath ( ) )
92+
93+ // 按钮位置计算
94+ int buttonX = value ? w - h + padding : padding ;
95+ int buttonY = padding ;
96+
97+ // 按钮绘制(带阴影)
98+ using ( var shadowPath = CreateRoundedRect ( buttonX - 2 , buttonY - 2 , h - padding * 2 + 4 , h - padding * 2 + 4 , ( h - padding * 2 ) / 2 ) )
99+ using ( var shadowBrush = new SolidBrush ( Color . FromArgb ( 50 , 0 , 0 , 0 ) ) )
100+ {
101+ g . FillPath ( shadowBrush , shadowPath ) ;
102+ }
103+
104+ using ( var buttonPath = CreateRoundedRect ( buttonX , buttonY , h - padding * 2 , h - padding * 2 , ( h - padding * 2 ) / 2 ) )
102105 {
103- path . AddArc ( new RectangleF ( a , a , d2 , d2 ) , 90 , 180 ) ;
104- path . AddLine ( new PointF ( r1 , a ) , new PointF ( w - r1 , a ) ) ;
105- path . AddArc ( new RectangleF ( w - d2 - a , a , d2 , d2 ) , - 90 , 180 ) ;
106- path . AddLine ( new PointF ( w - r1 , d2 + a ) , new PointF ( r1 , d2 + a ) ) ;
107- Color color = value ? MyMainForm . MainColor : Color . FromArgb ( 153 , 160 , 169 ) ; //Fixed color
108- using ( Brush brush = new SolidBrush ( color ) )
106+ using ( var buttonBrush = new SolidBrush ( Color . White ) )
109107 {
110- g . FillPath ( brush , path ) ;
108+ g . FillPath ( buttonBrush , buttonPath ) ;
111109 }
112110 }
113- using ( GraphicsPath path = new GraphicsPath ( ) )
111+
112+ // 高光效果
113+ using ( var highlightPath = CreateRoundedRect ( buttonX + 2 , buttonY + 2 , ( h - padding * 2 ) / 2 , ( h - padding * 2 ) / 2 , ( h - padding * 2 ) / 4 ) )
114+ using ( var highlightBrush = new SolidBrush ( Color . FromArgb ( 100 , 255 , 255 , 255 ) ) )
114115 {
115- path . AddEllipse ( new RectangleF ( value ? ( w - d2 - a ) : a , a , d2 , d2 ) ) ;
116- g . FillPath ( Brushes . White , path ) ;
116+ g . FillPath ( highlightBrush , highlightPath ) ;
117117 }
118118 }
119119 return bitmap ;
120120 }
121+
122+ private static GraphicsPath CreateRoundedRect ( float x , float y , float width , float height , float radius )
123+ {
124+ var path = new GraphicsPath ( ) ;
125+ path . AddArc ( x , y , radius * 2 , radius * 2 , 180 , 90 ) ; // 左上角
126+ path . AddArc ( x + width - radius * 2 , y , radius * 2 , radius * 2 , 270 , 90 ) ; // 右上角
127+ path . AddArc ( x + width - radius * 2 , y + height - radius * 2 , radius * 2 , radius * 2 , 0 , 90 ) ; // 右下角
128+ path . AddArc ( x , y + height - radius * 2 , radius * 2 , radius * 2 , 90 , 90 ) ; // 左下角
129+ path . CloseFigure ( ) ;
130+ return path ;
131+ }
121132 }
122133}
0 commit comments