| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- using System;
- using System.Collections;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- using System.Drawing.Imaging;
- using System.Drawing.Drawing2D;
- namespace HXX.Scanner.Starter.forms
- {
- public partial class roundButton : Button
- {
- enum model
- {
- hover,
- enter,
- press,
- enable
- }
- public Color HoverBackColor { get; set; }
- public Color EnterBackColor { get; set; }
- public Color PressBackColor { get; set; }
- public Color HoverForeColor { get; set; }
- public Color EnterForeColor { get; set; }
- public Color PressForeColor { get; set; }
- public int Radius { get; set; }
- model paintmodel = model.hover;
- public roundButton()
- {
- //InitializeComponent();
- //这些得带上,不然会有黑边
- FlatStyle = FlatStyle.Flat;
- FlatAppearance.BorderSize = 0;
- FlatAppearance.BorderColor = Color.FromArgb(0, 0, 0, 0);
- FlatAppearance.MouseDownBackColor = Color.Transparent;
- FlatAppearance.MouseOverBackColor = Color.Transparent;
- SetDefaultColor();
- }
- public void SetDefaultColor()
- {//给个初始值
- //HoverBackColor = Color.LightBlue;
- //EnterBackColor = Color.Blue;
- //PressBackColor = Color.DarkBlue;
- //HoverForeColor = Color.White;
- //EnterForeColor = Color.White;
- //PressForeColor = Color.White;
- HoverBackColor = Color.FromArgb(92, 154, 97);
- EnterBackColor = Color.FromArgb(92, 154, 97);
- PressBackColor = Color.FromArgb(92, 154, 97);
- HoverForeColor = Color.FromArgb(232, 244, 233);
- EnterForeColor = Color.FromArgb(232, 244, 233);
- PressForeColor = Color.FromArgb(232, 244, 233);
- Radius = 8;
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);//这个不能去,而且得放在前面,不然会有黑框之类的莫名其妙的东西
- var colorback = HoverBackColor;
- var colorfore = HoverForeColor;
- switch (paintmodel)
- {
- case model.hover:
- colorback = HoverBackColor;
- colorfore = HoverForeColor;
- break;
- case model.enter:
- colorback = EnterBackColor;
- colorfore = EnterForeColor;
- break;
- case model.press:
- colorback = PressBackColor;
- colorfore = PressForeColor;
- break;
- case model.enable:
- colorback = Color.LightGray;
- break;
- default:
- colorback = HoverBackColor;
- colorfore = HoverForeColor;
- break;
- }
- Draw(e.ClipRectangle, e.Graphics, false, colorback);
- DrawText(e.ClipRectangle, e.Graphics, colorfore);
- }
- protected override void OnMouseEnter(EventArgs e)
- {
- paintmodel = model.enter;
- base.OnMouseEnter(e);
- }
- protected override void OnMouseLeave(EventArgs e)
- {
- paintmodel = model.hover;
- base.OnMouseLeave(e);
- }
- protected override void OnMouseDown(MouseEventArgs mevent)
- {
- paintmodel = model.press;
- base.OnMouseDown(mevent);
- }
- protected override void OnEnabledChanged(EventArgs e)
- {
- paintmodel = Enabled ? model.hover : model.enable;
- Invalidate();//false 转换为true的时候不会刷新 这里强制刷新下
- base.OnEnabledChanged(e);
- }
- void Draw(Rectangle rectangle, Graphics g, bool cusp, Color begin_color, Color? end_colorex = null)
- {
- Color end_color = end_colorex == null ? begin_color : (Color)end_colorex;
- int span = 2;
- //抗锯齿
- g.SmoothingMode = SmoothingMode.AntiAlias;
- //渐变填充
- LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(rectangle, begin_color, end_color, LinearGradientMode.Vertical);
- //画尖角
- if (cusp)
- {
- span = 10;
- PointF p1 = new PointF(rectangle.Width - 12, rectangle.Y + 10);
- PointF p2 = new PointF(rectangle.Width - 12, rectangle.Y + 30);
- PointF p3 = new PointF(rectangle.Width, rectangle.Y + 20);
- PointF[] ptsArray = { p1, p2, p3 };
- g.FillPolygon(myLinearGradientBrush, ptsArray);
- }
- //填充
- g.FillPath(myLinearGradientBrush, DrawRoundRect(rectangle.X, rectangle.Y, rectangle.Width - span, rectangle.Height - 1, Radius));
- }
- void DrawText(Rectangle rectangle, Graphics g, Color color)
- {
- SolidBrush sbr = new SolidBrush(color);
- var rect = new RectangleF();
- switch (TextAlign)
- {
- case ContentAlignment.MiddleCenter:
- rect = getTextRec(rectangle, g);
- break;
- default:
- rect = getTextRec(rectangle, g);
- break;
- }
- g.DrawString(Text, Font, sbr, rect);
- }
- RectangleF getTextRec(Rectangle rectangle, Graphics g)
- {
- var rect = new RectangleF();
- var size = g.MeasureString(Text, Font);
- if (size.Width > rectangle.Width || size.Height > rectangle.Height)
- {
- rect = rectangle;
- }
- else
- {
- rect.Size = size;
- rect.Location = new PointF(rectangle.X + (rectangle.Width - size.Width) / 2, rectangle.Y + (rectangle.Height - size.Height) / 2);
- }
- return rect;
- }
- GraphicsPath DrawRoundRect(int x, int y, int width, int height, int radius)
- {
- //四边圆角
- GraphicsPath gp = new GraphicsPath();
- gp.AddArc(x, y, radius, radius, 180, 90);
- gp.AddArc(width - radius, y, radius, radius, 270, 90);
- gp.AddArc(width - radius, height - radius, radius, radius, 0, 90);
- gp.AddArc(x, height - radius, radius, radius, 90, 90);
- gp.CloseAllFigures();
- return gp;
- }
- }
- }
|