AngleControl.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using System;
  2. using System.Windows.Forms;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using FastReport.Utils;
  6. using System.ComponentModel;
  7. namespace FastReport.Controls
  8. {
  9. #if !DEBUG
  10. [DesignTimeVisible(false)]
  11. #endif
  12. internal class AngleControl : ContainerControl
  13. {
  14. private int angle;
  15. private bool showBorder;
  16. private NumericUpDown udAngle;
  17. private bool changed;
  18. private bool updating;
  19. public event EventHandler AngleChanged;
  20. public NumericUpDown NumericAngle { get { return udAngle; } }
  21. public int Angle
  22. {
  23. get { return angle; }
  24. set
  25. {
  26. updating = true;
  27. if (value < 0)
  28. value += 360;
  29. angle = value % 360;
  30. udAngle.Value = angle;
  31. Refresh();
  32. updating = false;
  33. }
  34. }
  35. public bool ShowBorder
  36. {
  37. get { return showBorder; }
  38. set
  39. {
  40. showBorder = value;
  41. Refresh();
  42. }
  43. }
  44. public bool Changed
  45. {
  46. get { return changed; }
  47. set { changed = value; }
  48. }
  49. private void RotateTo(int x, int y)
  50. {
  51. int size = Math.Min(Width, Height - 30);
  52. int cx = size / 2;
  53. int cy = cx;
  54. int r = x - cx == 0 ? (y > cy ? 90 : 270) : (int)(Math.Atan2((y - cy), (x - cx)) * 180 / Math.PI);
  55. Angle = (int)Math.Round(r / 15f) * 15;
  56. }
  57. private void udAngle_ValueChanged(object sender, EventArgs e)
  58. {
  59. if (updating)
  60. return;
  61. Angle = (int)udAngle.Value;
  62. Change();
  63. }
  64. private void Change()
  65. {
  66. changed = true;
  67. if (AngleChanged != null)
  68. AngleChanged(this, EventArgs.Empty);
  69. }
  70. protected override void OnPaint(PaintEventArgs e)
  71. {
  72. Graphics g = e.Graphics;
  73. Pen p = null;
  74. // draw control border
  75. if (showBorder)
  76. {
  77. using (p = new Pen(Color.FromArgb(127, 157, 185)))
  78. {
  79. g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
  80. }
  81. }
  82. g.SmoothingMode = SmoothingMode.AntiAlias;
  83. // draw ticks
  84. int size = Math.Min(Width, Height - 30);
  85. int cx = size / 2;
  86. int cy = cx;
  87. int radius = size / 2 - 10;
  88. p = new Pen(Color.Silver);
  89. p.DashStyle = DashStyle.Dot;
  90. g.DrawEllipse(p, 10, 10, size - 20, size - 20);
  91. p.Dispose();
  92. for (int i = 0; i < 360; i += 45)
  93. {
  94. Rectangle rect = new Rectangle(
  95. cx + (int)(Math.Cos(Math.PI / 180 * i) * radius) - 2,
  96. cy + (int)(Math.Sin(Math.PI / 180 * i) * radius) - 2,
  97. this.LogicalToDevice(4),
  98. this.LogicalToDevice(4));
  99. g.FillEllipse(i == angle ? Brushes.DarkOrange : SystemBrushes.Window, rect);
  100. g.DrawEllipse(i == angle ? Pens.DarkOrange : Pens.Black, rect);
  101. }
  102. // draw sample
  103. using (StringFormat sf = new StringFormat())
  104. {
  105. sf.Alignment = StringAlignment.Center;
  106. sf.LineAlignment = StringAlignment.Center;
  107. StandardTextRenderer.Draw(Res.Get("Misc,Sample"), GdiGraphics.FromGraphics(g), Font, SystemBrushes.WindowText, null,
  108. new RectangleF(cx - radius + 1, cy - radius + 1, radius * 2, radius * 2),
  109. sf, angle, 1);
  110. }
  111. }
  112. protected override void OnMouseDown(MouseEventArgs e)
  113. {
  114. RotateTo(e.X, e.Y);
  115. }
  116. protected override void OnMouseMove(MouseEventArgs e)
  117. {
  118. if (e.Button == MouseButtons.Left)
  119. RotateTo(e.X, e.Y);
  120. }
  121. protected override void OnMouseUp(MouseEventArgs e)
  122. {
  123. Change();
  124. }
  125. public AngleControl()
  126. {
  127. udAngle = new NumericUpDown();
  128. udAngle.Maximum = 360;
  129. udAngle.Increment = 15;
  130. udAngle.ValueChanged += new EventHandler(udAngle_ValueChanged);
  131. udAngle.Dock = DockStyle.Bottom;
  132. Controls.Add(udAngle);
  133. showBorder = true;
  134. SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
  135. Size = new Size(100, 130);
  136. BackColor = SystemColors.Window;
  137. Padding = new Padding(4);
  138. }
  139. }
  140. }