public SunControl(Control parent) { sunXY = new PictureBox(); var sunZ = new TrackBar { Orientation = Orientation.Vertical, Minimum = -100, Maximum = 100, Value = 0, }; parent.Controls.Add(sunXY); parent.Controls.Add(sunZ); parent.Resize += (sender, args) => { var width = Math.Min(parent.ClientSize.Width, parent.ClientSize.Height) - parent.Margin.Vertical - sunZ.Width - 8; if (parent.Width <= 0) { return; } sunXY.Size = new Size(width, width); sunZ.Height = width; Redraw(); }; sunXY.MouseMove += (sender, args) => { if ((args.Button & MouseButtons.Left) == 0) { return; } var delta = new Point { X = args.X - sunXY.Width / 2, Y = args.Y - sunXY.Height / 2 }; var r = (float)delta.Length(); Y = -(float)delta.X / r; X = -(float)delta.Y / r; Redraw(); NewPosition?.Invoke(new Point { X = X * xy, Y = Y * xy, Z = Z }); }; sunZ.ValueChanged += (sender, args) => { Z = sunZ.Value / 100F; Redraw(); NewPosition?.Invoke(new Point { X = X * xy, Y = Y * xy, Z = Z }); }; }