ProgressBarLabelControl.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.ComponentModel;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. namespace QVCopier.Components.ProgressBarLabel
  6. {
  7. public class ProgressBarLabelControl : ProgressBar
  8. {
  9. private readonly StringFormat _stringFormat = new() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
  10. private ContentAlignment _textAlign = ContentAlignment.MiddleCenter;
  11. [DefaultValue(ContentAlignment.MiddleCenter), Browsable(true)]
  12. public virtual ContentAlignment TextAlign
  13. {
  14. get => _textAlign;
  15. set
  16. {
  17. _textAlign = value;
  18. switch (value)
  19. {
  20. case ContentAlignment.TopLeft:
  21. _stringFormat.LineAlignment = StringAlignment.Near;
  22. _stringFormat.Alignment = StringAlignment.Near;
  23. break;
  24. case ContentAlignment.TopCenter:
  25. _stringFormat.LineAlignment = StringAlignment.Near;
  26. _stringFormat.Alignment = StringAlignment.Center;
  27. break;
  28. case ContentAlignment.TopRight:
  29. _stringFormat.LineAlignment = StringAlignment.Near;
  30. _stringFormat.Alignment = StringAlignment.Far;
  31. break;
  32. case ContentAlignment.MiddleLeft:
  33. _stringFormat.LineAlignment = StringAlignment.Center;
  34. _stringFormat.Alignment = StringAlignment.Near;
  35. break;
  36. case ContentAlignment.MiddleCenter:
  37. _stringFormat.LineAlignment = StringAlignment.Center;
  38. _stringFormat.Alignment = StringAlignment.Center;
  39. break;
  40. case ContentAlignment.MiddleRight:
  41. _stringFormat.LineAlignment = StringAlignment.Center;
  42. _stringFormat.Alignment = StringAlignment.Far;
  43. break;
  44. case ContentAlignment.BottomLeft:
  45. _stringFormat.LineAlignment = StringAlignment.Far;
  46. _stringFormat.Alignment = StringAlignment.Near;
  47. break;
  48. case ContentAlignment.BottomCenter:
  49. _stringFormat.LineAlignment = StringAlignment.Far;
  50. _stringFormat.Alignment = StringAlignment.Center;
  51. break;
  52. case ContentAlignment.BottomRight:
  53. _stringFormat.LineAlignment = StringAlignment.Far;
  54. _stringFormat.Alignment = StringAlignment.Far;
  55. break;
  56. default:
  57. throw new ArgumentOutOfRangeException(nameof(value), value, null);
  58. }
  59. Invalidate();//redraw component after change value from VS Properties section
  60. }
  61. }
  62. [Browsable(true)]
  63. public override string Text { get => base.Text; set => base.Text = value; }
  64. public ProgressBarLabelControl()
  65. {
  66. Value = Minimum;
  67. FixComponentBlinking();
  68. }
  69. private void FixComponentBlinking()
  70. {
  71. SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
  72. }
  73. protected override void OnPaint(PaintEventArgs e)
  74. {
  75. var g = e.Graphics;
  76. using var brush = new SolidBrush(ForeColor);
  77. var rect = ClientRectangle;
  78. ProgressBarRenderer.DrawHorizontalBar(g, rect);
  79. rect.Inflate(-3, -3);
  80. var progressBarRect = new Rectangle(rect.X, rect.Y, (int)Math.Round((float)Value / Maximum * rect.Width), rect.Height);
  81. if (Value > 0)
  82. {
  83. g.FillRectangle(brush, progressBarRect);
  84. }
  85. if (false == string.IsNullOrWhiteSpace(Text))
  86. {
  87. void DrawText(Color c)
  88. {
  89. using var br = new SolidBrush(c);
  90. g.DrawString(Text, Font, br, rect, _stringFormat);
  91. }
  92. g.SetClip(rect);
  93. DrawText(ForeColor);
  94. g.ResetClip();
  95. g.SetClip(progressBarRect);
  96. DrawText(BackColor);
  97. g.ResetClip();
  98. }
  99. }
  100. }
  101. }