圆角按钮_重绘圆角按钮

该博客介绍了一个自定义圆角按钮的实现,通过重绘实现不同状态下的背景颜色变化,包括鼠标按下、鼠标悬停和鼠标离开时的颜色效果。同时,该按钮允许设置自定义背景颜色。
摘要由CSDN通过智能技术生成

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace test

{

public partial class CustomButton : Button

{

///

/// 原始背景颜色

///

private Color defaultBgColor = Color.FromArgb(1, 2, 3);

///

/// 背景颜色

///

private Color bgColor = Color.FromArgb(1, 2, 3);

///

/// 自定义背景颜色

///

private Color _customBgColor = Color.FromArgb(34, 116, 70);

///

/// 中途改变背景色

///

private bool isChangeBgColor = false;

public CustomButton()

{

InitializeComponent();

}

///

/// 重绘

///

///

///

private void ParenButton_Paint(object sender, PaintEventArgs e)

{

if (defaultBgColor == Color.FromArgb(1, 2, 3))

{

//存在自定义颜色

if (_customBgColor != Color.FromArgb(34, 116, 70))

{

bgColor = _customBgColor;

defaultBgColor = _customBgColor;

}

else

{

bgColor = Color.Green;

defaultBgColor = Color.Green;

}

}

if (isChangeBgColor)

{

isChangeBgColor = false;

bgColor = _customBgColor;

defaultBgColor = _customBgColor;

}

//绘制倒角

drawRadius(e);

}

///

/// 绘制倒角

///

public void drawRadius(PaintEventArgs e)

{

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;//抗锯齿

int nRadius = 4;//圆角半径

GraphicsPath gp = new GraphicsPath();

int nWidth = e.ClipRectangle.Width - 1;

int nHeight = e.ClipRectangle.Height - 1;

//左上角

gp.AddArc(e.ClipRectangle.X, e.ClipRectangle.Y, nRadius, nRadius, 180, 90);

//右上角

gp.AddArc(nWidth - nRadius, e.ClipRectangle.Y, nRadius, nRadius, 270, 90);

//右下角

gp.AddArc(nWidth - nRadius, nHeight - nRadius, nRadius, nRadius, 0, 90);

//左下角

gp.AddArc(e.ClipRectangle.X, nHeight - nRadius, nRadius, nRadius, 90, 90);

//闭合曲线

gp.CloseAllFigures();

//按钮启用背景颜色

if (this.Enabled)

{

e.Graphics.FillPath(new SolidBrush(bgColor), gp);

}

//按钮禁用背景颜色

else

{

e.Graphics.FillPath(new SolidBrush(Color.Gray), gp);

}

//改变字体

if ("宋体".Equals(this.Font.Name) && this.Font.Size == 9f)

{

this.Font = new Font(new FontFamily("微软雅黑"), 9.75F);

}

PointF textPoint = new PointF();

SizeF textSize = TextRenderer.MeasureText(this.Text, this.Font);

SolidBrush brush = null;

//按钮启用字体颜色

if (this.Enabled)

{

brush = new SolidBrush(Color.White);

}

//按钮禁用字体颜色(可以自定义)

else

{

brush = new SolidBrush(Color.White);

}

//文字居中显示

textPoint.X = e.ClipRectangle.X + (e.ClipRectangle.Width - textSize.Width) / 2;

textPoint.Y = e.ClipRectangle.Y + (e.ClipRectangle.Height - textSize.Height) / 2 + 1;

//绘制文字

e.Graphics.DrawString(this.Text, this.Font, brush, textPoint.X, textPoint.Y);

}

#region 鼠标按钮事件

///

/// 鼠标按下

///

///

///

private void LhParenButton_MouseDown(object sender, MouseEventArgs e)

{

// 获取鼠标按下颜色

bgColor = getMouseDownColor();

//重绘控件

this.Invalidate();

}

///

/// 鼠标弹起

///

///

///

private void LhParenButton_MouseUp(object sender, MouseEventArgs e)

{

bgColor = defaultBgColor;

this.Invalidate();

}

///

/// 鼠标移入

///

///

///

private void LhParenButton_MouseHover(object sender, EventArgs e)

{

//获取鼠标移入颜色

bgColor = getMouseHoverColor();

this.Invalidate();

}

///

/// 鼠标移出

///

///

///

private void LhParenButton_MouseLeave(object sender, EventArgs e)

{

bgColor = defaultBgColor;

this.Invalidate();

}

///

/// 获取鼠标按下颜色

///

///

private Color getMouseDownColor()

{

byte r = getSingleColor(defaultBgColor.R, 80);

byte g = getSingleColor(defaultBgColor.G, 80);

byte b = getSingleColor(defaultBgColor.B, 80);

return Color.FromArgb(r, g, b);

}

///

/// 获取鼠标移入颜色

///

///

private Color getMouseHoverColor()

{

byte r = getSingleColor(defaultBgColor.R, 40);

byte g = getSingleColor(defaultBgColor.G, 40);

byte b = getSingleColor(defaultBgColor.B, 40);

return Color.FromArgb(r, g, b);

}

///

/// 获取单个颜色值

///

/// 单个颜色值

/// 增加值

///

private byte getSingleColor(byte color, byte addValue)

{

int newColor = color + addValue;

newColor = newColor > 255 ? 255 : newColor;

return byte.Parse(newColor.ToString());

}

#endregion

[Description("背景颜色"), Category("自定义属性")]

// 控件的自定义属性值

public Color customBgColor

{

get

{

return _customBgColor;

}

set

{

_customBgColor = value;

//中途改变背景颜色

if (defaultBgColor != Color.FromArgb(1, 2, 3))

{

isChangeBgColor = true;

}

this.Invalidate();

}

}

}

}

b239af4f3030f825a84e69d94d3f9784.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值