一、先上效果图,Winform
二、声明
几乎所有的代码都来自网络,主体代码来自【 http://bbs.cskin.net/thread-551-1-1.html 】,但是这篇作者的代码中有一些关键的方法和enum没有实现。
在下通过搜寻网络,补全了,并作了简单测试,原理我也说不清楚,在下典型的应用为王,能用就行,不到万不得已不去深究原理。
三、完整的控件代码,新建ButtonEx.cs的类,完全拷入即可。
//==代码开始=============================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel;
namespace LJF
{
public enum ControlState
{
Normal,
Hover,
Pressed
}
public enum RoundStyle
{
None,
Top,
Bottom,
Left,
Right,
All
}
public class GraphicsPathHelper
{
#region 建立带有圆角样式的路径
/// <summary>
/// 建立带有圆角样式的路径
/// </summary>
/// <param name="rect">用来建立路径的矩形</param>
/// <param name="radius">圆角半径</param>
/// <param name="style"></param>
/// <param name="correction"></param>
/// <returns></returns>
public static GraphicsPath CreatePath(
Rectangle rect, int radius, RoundStyle style, bool correction)
{
GraphicsPath path = new GraphicsPath();
int radiusCorrection = correction ? 1 : 0;
switch (style)
{
case RoundStyle.None:
path.AddRectangle(rect);
break;
case RoundStyle.All:
path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
path.AddArc(
rect.Right - radius - radiusCorrection,
rect.Y,
radius,
radius,
270,
90);
path.AddArc(
rect.Right - radius - radiusCorrection,
rect.Bottom - radius - radiusCorrection,
radius,
radius, 0, 90);
path.AddArc(
rect.X,
rect.Bottom - radius - radiusCorrection,
radius,
radius,
90,
90);
break;
case RoundStyle.Left:
path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
path.AddLine(
rect.Right - radiusCorrection, rect.Y,
rect.Right - radiusCorrection, rect.Bottom - radiusCorrection);
path.AddArc(
rect.X,
rect.Bottom - radius - radiusCorrection,
radius,
radius,
90,
90);
break;
case RoundStyle.Right:
path.AddArc(
rect.Right - radius - radiusCorrection,
rect.Y,
radius,
radius,
270,
90);
path.AddArc(
rect.Right - radius - radiusCorrection,
rect.Bottom - radius - radiusCorrection,
radius,
radius,
0,
90);
path.AddLine(rect.X, rect.Bottom - radiusCorrection, rect.X, rect.Y);
break;
case RoundStyle.Top: