roundButton.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Windows.Forms;
  7. using System.Runtime.InteropServices;
  8. using System.Drawing.Imaging;
  9. using System.Drawing.Drawing2D;
  10. namespace HXX.Scanner.Starter.forms
  11. {
  12. public partial class roundButton : Button
  13. {
  14. enum model
  15. {
  16. hover,
  17. enter,
  18. press,
  19. enable
  20. }
  21. public Color HoverBackColor { get; set; }
  22. public Color EnterBackColor { get; set; }
  23. public Color PressBackColor { get; set; }
  24. public Color HoverForeColor { get; set; }
  25. public Color EnterForeColor { get; set; }
  26. public Color PressForeColor { get; set; }
  27. public int Radius { get; set; }
  28. model paintmodel = model.hover;
  29. public roundButton()
  30. {
  31. //InitializeComponent();
  32. //这些得带上,不然会有黑边
  33. FlatStyle = FlatStyle.Flat;
  34. FlatAppearance.BorderSize = 0;
  35. FlatAppearance.BorderColor = Color.FromArgb(0, 0, 0, 0);
  36. FlatAppearance.MouseDownBackColor = Color.Transparent;
  37. FlatAppearance.MouseOverBackColor = Color.Transparent;
  38. SetDefaultColor();
  39. }
  40. public void SetDefaultColor()
  41. {//给个初始值
  42. //HoverBackColor = Color.LightBlue;
  43. //EnterBackColor = Color.Blue;
  44. //PressBackColor = Color.DarkBlue;
  45. //HoverForeColor = Color.White;
  46. //EnterForeColor = Color.White;
  47. //PressForeColor = Color.White;
  48. HoverBackColor = Color.FromArgb(92, 154, 97);
  49. EnterBackColor = Color.FromArgb(92, 154, 97);
  50. PressBackColor = Color.FromArgb(92, 154, 97);
  51. HoverForeColor = Color.FromArgb(232, 244, 233);
  52. EnterForeColor = Color.FromArgb(232, 244, 233);
  53. PressForeColor = Color.FromArgb(232, 244, 233);
  54. Radius = 8;
  55. }
  56. protected override void OnPaint(PaintEventArgs e)
  57. {
  58. base.OnPaint(e);//这个不能去,而且得放在前面,不然会有黑框之类的莫名其妙的东西
  59. var colorback = HoverBackColor;
  60. var colorfore = HoverForeColor;
  61. switch (paintmodel)
  62. {
  63. case model.hover:
  64. colorback = HoverBackColor;
  65. colorfore = HoverForeColor;
  66. break;
  67. case model.enter:
  68. colorback = EnterBackColor;
  69. colorfore = EnterForeColor;
  70. break;
  71. case model.press:
  72. colorback = PressBackColor;
  73. colorfore = PressForeColor;
  74. break;
  75. case model.enable:
  76. colorback = Color.LightGray;
  77. break;
  78. default:
  79. colorback = HoverBackColor;
  80. colorfore = HoverForeColor;
  81. break;
  82. }
  83. Draw(e.ClipRectangle, e.Graphics, false, colorback);
  84. DrawText(e.ClipRectangle, e.Graphics, colorfore);
  85. }
  86. protected override void OnMouseEnter(EventArgs e)
  87. {
  88. paintmodel = model.enter;
  89. base.OnMouseEnter(e);
  90. }
  91. protected override void OnMouseLeave(EventArgs e)
  92. {
  93. paintmodel = model.hover;
  94. base.OnMouseLeave(e);
  95. }
  96. protected override void OnMouseDown(MouseEventArgs mevent)
  97. {
  98. paintmodel = model.press;
  99. base.OnMouseDown(mevent);
  100. }
  101. protected override void OnEnabledChanged(EventArgs e)
  102. {
  103. paintmodel = Enabled ? model.hover : model.enable;
  104. Invalidate();//false 转换为true的时候不会刷新 这里强制刷新下
  105. base.OnEnabledChanged(e);
  106. }
  107. void Draw(Rectangle rectangle, Graphics g, bool cusp, Color begin_color, Color? end_colorex = null)
  108. {
  109. Color end_color = end_colorex == null ? begin_color : (Color)end_colorex;
  110. int span = 2;
  111. //抗锯齿
  112. g.SmoothingMode = SmoothingMode.AntiAlias;
  113. //渐变填充
  114. LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(rectangle, begin_color, end_color, LinearGradientMode.Vertical);
  115. //画尖角
  116. if (cusp)
  117. {
  118. span = 10;
  119. PointF p1 = new PointF(rectangle.Width - 12, rectangle.Y + 10);
  120. PointF p2 = new PointF(rectangle.Width - 12, rectangle.Y + 30);
  121. PointF p3 = new PointF(rectangle.Width, rectangle.Y + 20);
  122. PointF[] ptsArray = { p1, p2, p3 };
  123. g.FillPolygon(myLinearGradientBrush, ptsArray);
  124. }
  125. //填充
  126. g.FillPath(myLinearGradientBrush, DrawRoundRect(rectangle.X, rectangle.Y, rectangle.Width - span, rectangle.Height - 1, Radius));
  127. }
  128. void DrawText(Rectangle rectangle, Graphics g, Color color)
  129. {
  130. SolidBrush sbr = new SolidBrush(color);
  131. var rect = new RectangleF();
  132. switch (TextAlign)
  133. {
  134. case ContentAlignment.MiddleCenter:
  135. rect = getTextRec(rectangle, g);
  136. break;
  137. default:
  138. rect = getTextRec(rectangle, g);
  139. break;
  140. }
  141. g.DrawString(Text, Font, sbr, rect);
  142. }
  143. RectangleF getTextRec(Rectangle rectangle, Graphics g)
  144. {
  145. var rect = new RectangleF();
  146. var size = g.MeasureString(Text, Font);
  147. if (size.Width > rectangle.Width || size.Height > rectangle.Height)
  148. {
  149. rect = rectangle;
  150. }
  151. else
  152. {
  153. rect.Size = size;
  154. rect.Location = new PointF(rectangle.X + (rectangle.Width - size.Width) / 2, rectangle.Y + (rectangle.Height - size.Height) / 2);
  155. }
  156. return rect;
  157. }
  158. GraphicsPath DrawRoundRect(int x, int y, int width, int height, int radius)
  159. {
  160. //四边圆角
  161. GraphicsPath gp = new GraphicsPath();
  162. gp.AddArc(x, y, radius, radius, 180, 90);
  163. gp.AddArc(width - radius, y, radius, radius, 270, 90);
  164. gp.AddArc(width - radius, height - radius, radius, radius, 0, 90);
  165. gp.AddArc(x, height - radius, radius, radius, 90, 90);
  166. gp.CloseAllFigures();
  167. return gp;
  168. }
  169. }
  170. }