현재 켜짐 상태와 컨트롤 크기에 맞게 전구 유리, 필라멘트 및 소켓을 그립니다.
100 {
101 base.OnPaint(e);
102
103 var g = e.Graphics;
104 g.SmoothingMode = SmoothingMode.AntiAlias;
105
106 var d = Math.Min(_diameter, Math.Min(Width * .85f, Height * .62f));
107 var cx = Width / 2f;
108 var top = 4f;
109
110 var glassFill = _isOn ? Color.FromArgb(255, 214, 102) : Color.FromArgb(42, 100, 116, 139);
111 var glassStroke = _isOn ? Color.FromArgb(255, 196, 0) : Color.FromArgb(102, 117, 139);
112 var filament = _isOn ? Color.FromArgb(122, 75, 0) : Color.FromArgb(100, 116, 139);
113 var baseFill = Color.FromArgb(112, 128, 152);
114 using var glassPath = CreateGlassPath(cx, top, d);
115
116 if (_isOn)
117 {
118 using var glow = new SolidBrush(Color.FromArgb(70, 255, 214, 102));
119 g.FillEllipse(glow, cx - d * .62f, top + d * .50f - d * .62f, d * 1.24f, d * 1.24f);
120 }
121
122 using var fill = new SolidBrush(glassFill);
123 using var stroke = new Pen(glassStroke, 4);
124 g.FillPath(fill, glassPath);
125 g.DrawPath(stroke, glassPath);
126
127 using var filamentPen = new Pen(filament, 4)
128 {
129 StartCap = LineCap.Round,
130 EndCap = LineCap.Round
131 };
132 g.DrawBezier(filamentPen, cx - d * .22f, top + d * .56f, cx - d * .12f, top + d * .38f, cx - d * .02f, top + d * .72f, cx + d * .10f, top + d * .53f);
133 g.DrawBezier(filamentPen, cx + d * .10f, top + d * .53f, cx + d * .16f, top + d * .44f, cx + d * .21f, top + d * .49f, cx + d * .25f, top + d * .55f);
134
135 var neckTop = top + d * .92f;
136 using var baseBrush = new SolidBrush(baseFill);
137 g.FillPolygon(baseBrush, new[]
138 {
139 new PointF(cx - d * .30f, neckTop),
140 new PointF(cx + d * .30f, neckTop),
141 new PointF(cx + d * .20f, neckTop + d * .26f),
142 new PointF(cx - d * .20f, neckTop + d * .26f)
143 });
144 FillRib(g, baseBrush, cx, neckTop + d * .10f, d * .44f);
145 FillRib(g, baseBrush, cx, neckTop + d * .22f, d * .36f);
146 FillRib(g, baseBrush, cx, neckTop + d * .34f, d * .27f);
147 }