init
This commit is contained in:
131
DogAndArmControl/ModernButton.cs
Normal file
131
DogAndArmControl/ModernButton.cs
Normal file
@@ -0,0 +1,131 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace RoboticControlApp
|
||||
{
|
||||
public class ModernButton : Button
|
||||
{
|
||||
private bool isPressed = false;
|
||||
private string description;
|
||||
private Color normalColor = Color.FromArgb(245, 245, 245);
|
||||
private Color hoverColor = Color.FromArgb(230, 230, 230);
|
||||
private Color pressedColor = Color.FromArgb(0, 120, 215);
|
||||
private Color borderColor = Color.FromArgb(200, 200, 200);
|
||||
|
||||
public ModernButton(string key, string desc)
|
||||
{
|
||||
description = desc;
|
||||
Text = key;
|
||||
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.ResizeRedraw, true);
|
||||
FlatStyle = FlatStyle.Flat;
|
||||
FlatAppearance.BorderSize = 0;
|
||||
Font = new Font("Microsoft YaHei", 10F, FontStyle.Bold);
|
||||
BackColor = normalColor;
|
||||
ForeColor = Color.Black;
|
||||
Cursor = Cursors.Hand;
|
||||
}
|
||||
|
||||
public void SetPressed(bool pressed)
|
||||
{
|
||||
isPressed = pressed;
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
Graphics g = e.Graphics;
|
||||
g.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
// 确定颜色
|
||||
Color bgColor = isPressed ? pressedColor : (ClientRectangle.Contains(PointToClient(MousePosition)) ? hoverColor : normalColor);
|
||||
Color textColor = isPressed ? Color.White : Color.Black;
|
||||
|
||||
// 绘制背景
|
||||
using (SolidBrush brush = new SolidBrush(bgColor))
|
||||
{
|
||||
g.FillRoundedRectangle(brush, ClientRectangle, 8);
|
||||
}
|
||||
|
||||
// 绘制边框
|
||||
using (Pen pen = new Pen(isPressed ? pressedColor : borderColor, 1))
|
||||
{
|
||||
g.DrawRoundedRectangle(pen, new Rectangle(0, 0, Width - 1, Height - 1), 8);
|
||||
}
|
||||
|
||||
// 绘制按键文本
|
||||
using (SolidBrush textBrush = new SolidBrush(textColor))
|
||||
{
|
||||
StringFormat sf = new StringFormat();
|
||||
sf.Alignment = StringAlignment.Center;
|
||||
sf.LineAlignment = StringAlignment.Center;
|
||||
|
||||
Font keyFont = new Font("Microsoft YaHei", 12F, FontStyle.Bold);
|
||||
g.DrawString(Text, keyFont, textBrush, new RectangleF(0, 0, Width, Height * 0.6f), sf);
|
||||
|
||||
if (!string.IsNullOrEmpty(description))
|
||||
{
|
||||
Font descFont = new Font("Microsoft YaHei", 8F);
|
||||
g.DrawString(description, descFont, textBrush, new RectangleF(0, Height * 0.6f, Width, Height * 0.4f), sf);
|
||||
}
|
||||
}
|
||||
|
||||
// 绘制按下效果
|
||||
if (isPressed)
|
||||
{
|
||||
using (SolidBrush shadowBrush = new SolidBrush(Color.FromArgb(50, 0, 0, 0)))
|
||||
{
|
||||
g.FillRoundedRectangle(shadowBrush, new Rectangle(2, 2, Width - 4, Height - 4), 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnMouseEnter(EventArgs e)
|
||||
{
|
||||
base.OnMouseEnter(e);
|
||||
if (!isPressed) Invalidate();
|
||||
}
|
||||
|
||||
protected override void OnMouseLeave(EventArgs e)
|
||||
{
|
||||
base.OnMouseLeave(e);
|
||||
if (!isPressed) Invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// 扩展方法用于绘制圆角矩形
|
||||
public static class GraphicsExtensions
|
||||
{
|
||||
public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle rect, int radius)
|
||||
{
|
||||
using (GraphicsPath path = CreateRoundedRectanglePath(rect, radius))
|
||||
{
|
||||
graphics.FillPath(brush, path);
|
||||
}
|
||||
}
|
||||
|
||||
public static void DrawRoundedRectangle(this Graphics graphics, Pen pen, Rectangle rect, int radius)
|
||||
{
|
||||
using (GraphicsPath path = CreateRoundedRectanglePath(rect, radius))
|
||||
{
|
||||
graphics.DrawPath(pen, path);
|
||||
}
|
||||
}
|
||||
|
||||
private static GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int radius)
|
||||
{
|
||||
GraphicsPath path = new GraphicsPath();
|
||||
int diameter = radius * 2;
|
||||
|
||||
path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
|
||||
path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
|
||||
path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
|
||||
path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
|
||||
path.CloseFigure();
|
||||
|
||||
return path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user