问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#如何改button形状

发布网友 发布时间:2022-08-19 03:16

我来回答

2个回答

热心网友 时间:2023-10-21 21:32

ImageButton是asp.net中的控件。如果说是winform,可以用普通的button 设置背景图和按钮的显示格式。也可以用imagebox控件。

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text;

namespace 自定义水晶按钮
{
/// <summary>
/// UserControl1 的摘要说明。
/// </summary>
public class TestButton : Button
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

private enum MouseActionType//定义鼠标的点击类型
{
None,
Hover,
Click
}

private MouseActionType mouseAction;
private ImageAttributes imgAttr = new ImageAttributes();
private Bitmap buttonBitmap;
private Rectangle buttonBitmapRectangle;

public TestButton()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();

// TODO: 在 InitComponent 调用后添加任何初始化

mouseAction = MouseActionType.None;

//应用双缓冲技术是画面不闪烁
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer |
ControlStyles.UserPaint, true);

//修改默认的字体,背景色,大小
this.Font = new Font("宋体", 12, FontStyle.Bold);
this.BackColor = Color.DarkTurquoise;
this.Size = new Size(100, 40);

}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}

#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion

private GraphicsPath GetGraphicsPath(Rectangle rc, int r)
{
int x = rc.X, y = rc.Y, w = rc.Width, h = rc.Height;
GraphicsPath path = new GraphicsPath();
path.AddArc(x, y, r, r, 180, 90); //左上角的椭圆
path.AddArc(x + w - r, y, r, r, 270, 90);//右上角的椭圆
path.AddArc(x + w - r, y + h - r, r, r, 0, 90);//左下角的椭圆
path.AddArc(x, y + h - r, r, r, 90, 90);//右下角的椭圆
path.CloseFigure();
return path;
}

protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//g.Clear(Color.White);
g.Clear(SystemColors.Control);//清空画布的三维颜色
Color clr = this.BackColor;
int shadowOffset = 8;
int btnOffset = 0;
switch (mouseAction)
{
case MouseActionType.Click:
shadowOffset = 4;
clr = Color.DeepSkyBlue;
btnOffset = 2;
break;
case MouseActionType.Hover:
clr = Color.DeepSkyBlue;
break;
}
g.SmoothingMode = SmoothingMode.AntiAlias;

///
/// 创建按钮本身的图形
///
Rectangle rc = new Rectangle(btnOffset, btnOffset, this.ClientSize.Width - 8 - btnOffset, this.ClientSize.Height - 8 - btnOffset);
GraphicsPath path1 = this.GetGraphicsPath(rc, 20);

//一个起始点和一个终点 用渐变的颜色来填充
LinearGradientBrush br1 = new LinearGradientBrush(new Point(0, 0), new Point(0, rc.Height + 6), clr, Color.White);

///
/// 创建按钮阴影
///
Rectangle rc2 = rc;
rc2.Offset(shadowOffset, shadowOffset);
GraphicsPath path2 = this.GetGraphicsPath(rc2, 20);
PathGradientBrush br2 = new PathGradientBrush(path2);
br2.CenterColor = Color.Black;
br2.SurroundColors = new Color[] {SystemColors.Control};
//为了更*真,我们将渐变结束颜色设定为窗体前景颜色,可以根据窗口的前景颜色适当调整

///
/// 创建按钮顶部白色渐变
///
Rectangle rc3 = rc;
rc3.Inflate(-5, -5);
rc3.Height = 15;
GraphicsPath path3 = GetGraphicsPath(rc3, 20);

LinearGradientBrush br3 = new LinearGradientBrush(rc3, Color.FromArgb(255, Color.White), Color.FromArgb(0, Color.White), LinearGradientMode.Vertical);

///
/// 绘制图形
///
g.FillPath(br2, path2);//绘制阴影
g.FillPath(br1, path1); //绘制按钮
g.FillPath(br3, path3); //绘制顶部白色泡泡

///
///设定内存位图对象,进行二级缓存绘图操作 双缓冲
///
buttonBitmapRectangle = new Rectangle(rc.Location, rc.Size);
buttonBitmap = new Bitmap(buttonBitmapRectangle.Width, buttonBitmapRectangle.Height);
Graphics g_bmp = Graphics.FromImage(buttonBitmap);
g_bmp.SmoothingMode = SmoothingMode.AntiAlias;
g_bmp.FillPath(br1, path1);
g_bmp.FillPath(br3, path3);

///
///将region赋值给button
Region rgn = new Region(path1);
rgn.Union(path2);
this.Region = rgn;

///
/// 绘制按钮的文本
///
GraphicsPath path4 = new GraphicsPath();

RectangleF path1bounds = path1.GetBounds();

Rectangle rcText = new Rectangle((int)path1bounds.X + btnOffset, (int)path1bounds.Y + btnOffset, (int)path1bounds.Width, (int)path1bounds.Height);

StringFormat strformat = new StringFormat();
strformat.Alignment = StringAlignment.Center;
strformat.LineAlignment = StringAlignment.Center;
path4.AddString(this.Text, this.Font.FontFamily, (int)this.Font.Style, this.Font.Size, rcText, strformat);

Pen txtPen = new Pen(this.ForeColor , 1);
g.DrawPath(txtPen, path4);
g_bmp.DrawPath(txtPen, path4);
}

//重写一系列事件
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.mouseAction = MouseActionType.Click;
this.Invalidate();
}
base.OnMouseDown(e);
}

protected override void OnMouseUp(MouseEventArgs e)
{
this.mouseAction = MouseActionType.Hover;
this.Invalidate();
base.OnMouseUp(e);
}

protected override void OnMouseHover(EventArgs e)
{
this.mouseAction = MouseActionType.Hover;
this.Invalidate();
base.OnMouseHover(e);
}

protected override void OnMouseEnter(EventArgs e)
{
this.mouseAction = MouseActionType.Hover;
this.Invalidate();
base.OnMouseEnter(e);
}

protected override void OnMouseLeave(EventArgs e)
{
this.mouseAction = MouseActionType.None;
this.Invalidate();
base.OnMouseLeave(e);
}
}
}

热心网友 时间:2023-10-21 21:33

呃,我以前有做过将form窗体变形状的,记得很麻烦,需要重写form类,还要会一些画图,你想改变按钮的形状的话,估计也要重写button这个类,或者有三方插件之类的,你可以在百度搜搜相关的代码,我没有时间帮你做一个例子了 - -~!
呵呵,你也可以加分 让别人把demo发给你!
重赏之下必有勇夫!
就是这样!
加油!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
交通工程好考公务员吗 交通工程类考公时包括哪些专业 交通工程专业的能报考什么样的公务员 交通工程专业往哪些方向考公务员 交通工程可以考公务员有哪些岗位 我专业交通工程。能考什么类型的公务员 支付宝怎么关联另一个账号 支付宝怎么关联另一个支付宝 支付宝关联账号在哪里?怎么添加? 京东买手机发票可以开别人名字吗 怎样保持一份好心情,有什么办法 七夕水什么时候打最好 七月初七的水神奇在哪里 华夏八载和太平洋保险谁比较好 请问人寿,太平洋,华夏哪个保险好 我想买份重疾保险,不知道华夏人寿和太平洋那个好,理赔还有保障? ETC信用卡可以消费吗 兼具信用卡+ETC两大功能 工行etc信用卡可以消费吗?试试不就清楚了 梦见黑熊圈在笼子里向外丢东西? 梦见笼子里许多只狗熊昨晚梦见在邻居家看见大铁笼里有很多只狗熊不知道什么意思 七夕节怎么过才好 闯红灯如何被处罚 闯红灯应该如何处罚 东莞电动车闯红灯怎么处罚 有那些好听的音乐网站??? 关于七夕水的实验 炒咖哩马铃薯的经典做法? 对方共享后,我还是看不到她电脑 网络共享,别人能进入我的电脑共享,但是我却看不见别人的电脑。怎么解决? 媒体报道陈意涵二胎顺利产女,38岁的她结婚3年,和丈夫之间的感情如何? 陈意涵怀孕9个月挺孕肚走红毯,她的状态如何? 七月七的水是什么水来的? 七一联欢会唱什么歌好 七一联欢会适合唱什么歌?最好是顺口点的,歌词简单点的!! 在抖音有人私信我进不进公会,不签合同,只需要我提供实名认证的名字!公会真的会给作品加流量吗?_百度问一问 中元节前三后四禁忌 中元节前三后四是什么意思 盐山格林豪泰怎么走 滨州到天津 河北省沧州市青县新生儿上户口需要什么材料 临朐到临沂的长途汽车发车时间和到站时间? 空调制热要加氟吗?空调加氟的方法是什么? 手机号最近一年内已绑定过5个,已达到限制,无法再绑定!怎么办? 呼吸气囊怎么进行消毒 儿语音词语写三个。 儿童语音发育迟缓该怎么办 怎么找到咽音的发声位置的呀? 谁能给我讲讲咽音泛音是什么?以及其发音方法! 如何添加QQ机器人为好友。 修改密码忘记了怎么办? 修改忘记原密码怎么办 梦到救了一只白色的猫