C# 圆角button
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace winformTest
{
public partial class XButton : Button
{ /// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null; /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} /// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
} 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 XButton()
{
InitializeComponent();
//这些得带上,不然会有黑边
FlatStyle = FlatStyle.Flat;
FlatAppearance.BorderSize = ;
FlatAppearance.BorderColor = Color.FromArgb(, , , );
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;
Radius = ;
} 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 = ;
//抗锯齿
g.SmoothingMode = SmoothingMode.AntiAlias;
//渐变填充
LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(rectangle, begin_color, end_color, LinearGradientMode.Vertical);
//画尖角
if (cusp)
{
span = ;
PointF p1 = new PointF(rectangle.Width - , rectangle.Y + );
PointF p2 = new PointF(rectangle.Width - , rectangle.Y + );
PointF p3 = new PointF(rectangle.Width, rectangle.Y + );
PointF[] ptsArray = { p1, p2, p3 };
g.FillPolygon(myLinearGradientBrush, ptsArray);
}
//填充
g.FillPath(myLinearGradientBrush, DrawRoundRect(rectangle.X, rectangle.Y, rectangle.Width - span, rectangle.Height - , 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) / , rectangle.Y + (rectangle.Height - size.Height) / );
}
return rect;
}
GraphicsPath DrawRoundRect(int x, int y, int width, int height, int radius)
{
//四边圆角
GraphicsPath gp = new GraphicsPath();
gp.AddArc(x, y, radius, radius, , );
gp.AddArc(width - radius, y, radius, radius, , );
gp.AddArc(width - radius, height - radius, radius, radius, , );
gp.AddArc(x, height - radius, radius, radius, , );
gp.CloseAllFigures();
return gp;
}
}
}
C# 圆角button的更多相关文章
- Android怎样设置圆角button
1. 在res文件夹下的drawable文件夹下新建shape.xml文件 <?xml version="1.0" encoding="utf-8"?&g ...
- Android 自己定义UI圆角button
Android实际开发中我们一般须要圆角的button,普通情况下我们能够让美工做出来对应的button图片.然后放上去就可以,另外我们能够在布局文件里直接设置,也能够达到一样的效果. 以下解说在布局 ...
- Android 圆角Button
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbEAAADrCAYAAADnsqiUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAA
- Android学习之——实现圆角Button
在drawable文件夹下新建btn_shape.xml文件: <?xml version="1.0" encoding="utf-8"?> < ...
- <Android 基础(二十六)> 渐变色圆角Button
简介 总结下之前看的自定义View的内容,结合一个简单的例子,阐述下基本用法和大致的使用流程,这个例子比较简单,更复杂的自定义View,随着自己的学习,后面再慢慢添加.作为一个Android开发者,这 ...
- jQuery Mobile(jqm)button的隐藏和显示,包含a标签,圆角和非圆角button
在移动互联网时代,HTML5开发越来越收到欢迎. 于是各种HTML5的框架都出来了.因为对于jquery的熟悉,jquery mobile 为多数人选择学习的对象.我也是众多追求者之中的一个.近期一直 ...
- 圆角button
方案1: <Window.Resources> <ControlTemplate x:Key="CornerButton" TargetType="{x ...
- Android Demo---如何敲出圆角的Button+圆角头像
经常玩儿App的小伙伴都知道,APP上面有很多按钮都是圆角的,圆形给人感觉饱满,富有张力,不知道设计圆角按钮的小伙伴是不是和小编有着相同的想法`(*∩_∩*)′,听小编公司开发IOS的小伙伴说,他们里 ...
- UWP Button添加圆角阴影(二)
原文:UWP Button添加圆角阴影(二) 阴影 对于阴影呢,WindowsCommunityToolkit中已经有封装好的DropShadowPanel啦,只要引用Microsoft.Toolki ...
随机推荐
- 题目1005:Graduate Admission(结构体排序)
问题来源 http://ac.jobdu.com/problem.php?pid=1005 问题描述 这道题理解题意有些麻烦,多看几遍先理解题意再说.每个学生有自己的三个成绩,一个编号,以及一个志愿列 ...
- C#-WebForm-★★★JQuery知识——DOM操作★★★
例如: $("#btn1").attr( "disabled" , "disabled" ); 例如: $("#d1") ...
- Linux基础篇–shell脚本编程基础
本章内容概要 编程基础 脚本基本格式 变量 运算 条件测试 配置用户环境 7.1 编程基础程序:指令+数据程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心 ...
- 华南理工大学“三七互娱杯”程序设计竞赛 HRY and codefire(概率期望DP)
https://ac.nowcoder.com/acm/contest/874/A 题目:有两个账号 , 一开始都为0级 , 求任意一个账号升级到N的期望 要求:如果当前账号嬴了 , 就继续沿用当前的 ...
- IC79620: USER'S ROUTINE MAY BE TERMINATED ABNORMALLY IF SOME SYSTEMROUTINES WERE RUN IN DB2FMP BEFORE
http://www-01.ibm.com/support/docview.wss?uid=swg1IC79620 APAR status Closed as program error. Error ...
- JDK中ClassLoader的分类以及ClassLoader间的层次关系
几个常见的ClassLoader: bootstrap class loader: 最早启动的class loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的.这个cl ...
- TestNG学习地址分享
谨以此随笔来记录一个曾经学习TestNG的网站,供以后作为工具书查阅. 链接地址,点击此处.
- 关于dubbo调度时出现Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method insertTestTb in the service cn.cuibusi.core.service.TestTbService.的解决办法
在用dubbo跨项目调度service时出现如下错误: 错误原因:pojo没有实现序列化 解决方法:在pojo实现序列化接口即可
- cocos2d-x中描述精灵帧图片的plist和json文件各个key的含义
最近在研究cocos,互联网行业中,手游业最近的表现是非常的火,加上本身对游戏有浓厚兴趣,所以便染指了游戏引擎~ 这次的废话就这么简短吧,因为这次记录的东西本身就很少. 在cocos中,为精灵帧添加缓 ...
- a+b+c的N次方展开
今天在给儿子看笔记本上的照片的时候,偶然发现了2009年手绘的一张a+b+c的N次方展开图,故写下面的博客以记之,为年轻时代的我点个赞! 20年前的我,一个充满激情的且富有专注力的数学发烧友! 10年 ...