在使用C#进行界面开发的过程中,做界面开发经常会用到按钮,而C#界面中的按钮形状只有矩形的,而如果我们需要其他形状的按钮的话,就需要想点儿其他办法了,一般开发自己的控件有三种方法:

首先是复合控件,从字面上就可以理解,是在原有控件的基础上进行组合,组合后的控件就是一个全新的控件;

其次是扩展控件,一般控件都是用一个类进行了封装,我们可以通过继承该类,然后对其进行改写,赋予其新的特性;

最后是自定义控件,这个方法是“写我们自己的控件”,DIY的程度最高,当然对编程要求也最高,也是最灵活,最强大的方法;

本文先说说第二种方法的具体实现。

该方法是对原有的类进行改写,比如我们需要修改button的属性,可以对button类进行修改并继承,进行onpaint函数的重新改写。这样做的好处就是可以使得做出来的界面比较友好,在按钮的形状和颜色方面相比原来的会比较丰富一些。

具体的操作过程如下:

在VS2015下,新建类库,取名,确定。

然后引用动态库System.Windows.Forms:

添加如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.ComponentModel;namespace myNewButton
{public class colorfulButton:Button{Rectangle r= new Rectangle(0, 0, 150, 80);Rectangle r2 = new Rectangle(0,0,100,50);private Brush _myBrush = null;private Color _color1 = System.Drawing.Color.FromArgb(255, 255, 192);private Color _color2 = System.Drawing.Color.FromArgb(0, 0, 192);[Category("设置"), Description("渐变开始颜色")]public Color color1{get { return _color1; }set { _color1 = value; }}[Category("设置"), Description("渐变结束颜色")]public Color color2{get { return _color2; }set { _color2 = value; }}public void ButtonNew(){r = new Rectangle(0, 0, 150, 80);_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);}public Brush MyBrush{get { return _myBrush; }set { _myBrush = value; }}protected override void OnResize(EventArgs e){base.OnResize(e);r = new Rectangle(0, 0, this.Width, this.Height);_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);}protected override void OnMouseLeave(EventArgs e){base.OnMouseLeave(e);r = new Rectangle(0, 0, this.Width, this.Height);_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);}protected override void OnMouseEnter(EventArgs e){base.OnMouseEnter(e);r = new Rectangle(0, 0, this.Width, this.Height);_myBrush = new LinearGradientBrush(r, _color2, _color1, LinearGradientMode.Vertical);}protected override void OnPaint(PaintEventArgs pevent){base.OnPaint(pevent);Graphics g = pevent.Graphics;_myBrush = new LinearGradientBrush(r, _color1, _color2, LinearGradientMode.Vertical);g.FillRectangle(_myBrush,this.ClientRectangle);StringFormat strF = new StringFormat();strF.Alignment = StringAlignment.Center;strF.LineAlignment = StringAlignment.Center;g.DrawString(this.Text, this.Font, new SolidBrush(Color.Black), this.ClientRectangle, strF);}      }
}

有关C#中重写按钮的onpaint函数,实现按钮形状的用户自定义相关推荐

  1. android按钮背景颜色函数,Android按钮背景颜色(Android button background color)

    Android按钮背景颜色(Android button background color) 我想在我的应用程序中设置按钮的背景颜色,我无法实现我想要的结果... 我试图设置的颜色是holo_gree ...

  2. MFC中的Invalidate、OnDraw、OnPaint函数的作用及绘图概念

    1.绘图概念 GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制, Invalidate()     如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行 ...

  3. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  4. OnPaint()函数的作用原理

    WM_PAINT是窗口每次重绘都会产生的一个消息. OnPaint是对这个消息的反应函数 mfc 的 CWnd::OnPaint 没做什么,只是丢给系统处理. 一 : 先执行OnEraseBkgnd, ...

  5. WM_PAINT介绍及OnPaint()函数的作用原理

    生的一个消息. *  MFC中 OnPaint()是对这个消息的反应函数( mfc 的 CWnd::OnPaint() 没做什么,只是丢给系统处理,下面就是介绍它在系统中的处理流程) 关于 WM_PA ...

  6. [安卓] 2、使用2中方法做按钮监听和图片按钮使用

      第一种方法是使用点击监听器来实现(代码中注释掉的部分):这种方法要在初始化的函数中将按钮绑定在点击监听器上(23,24)btn_ok.setOnClickListener(this);.然后处理统 ...

  7. JS中的setTimeout和setInterval函数

    目录 前言 setTimeout setTimeout()函数应用之点名器 setInterval setInterval应用之重写点名器 前言 在生活中,常有定时做某事,或者循环做某事的需求,如设置 ...

  8. 在GridView中添加按钮后,如何触发按钮的各种事件?

    //在GridView中添加按钮后,如何触发按钮的各种事件? 1.在GridView的"编辑列"属性窗口中,增加新的Botton列. 2.然后再该窗口右边属性中,将外观项下的But ...

  9. oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

最新文章

  1. 聊聊spring cloud gateway的PreserveHostHeaderGatewayFilter
  2. 字符串操作(Java)
  3. Java并发编程-CountDownLatch
  4. Codeforces791:Ordinary Numbers题解
  5. 如何解决开发人员的工作无法量化的问题
  6. 23种设计模式(上)
  7. 火神山医院紧急招募IT运维志愿者需求
  8. apk ionic 破损_cordova – ionic build android不生成任何.apk文件或错误
  9. 【DOS】dos命令大全
  10. 如何阻止 AcrobatPro DC自动更新升级?
  11. 初步认识图像的直方图
  12. html table 显示最后一条,漂亮CSS表格(Table),最后一行是汇总行【实例】
  13. java最新 学习路线
  14. 飞腾服务器虚拟化,基于飞腾平台的容器虚拟化技术研究
  15. 椭圆抛物面matlab程序,椭圆抛物面画法.pdf
  16. vi/vim的一些干货命令及快捷键(跳转最后一行,跳转行末等)~舒服!!!
  17. [技美CG]Unity3D复刻UnityShader 之 ShaderToy - Bubbles
  18. 解读GDPR | 你应该知道的那些事儿
  19. python适合女生吗-女生学数据分析好吗?数据分析适不适合女生学?
  20. 教你如何睡觉,一定要看!!!

热门文章

  1. 【C#】C# List Sort 按照字母排序 多字段排序
  2. 【Vue】微信扫码支付
  3. Velocity+IText+Flying-saucer生成pdf文件
  4. service XXX restart的执行流程
  5. comsol纳米光学案例分析
  6. 求数组排序后相邻数的最大差值
  7. win7打不开计算机网络连接,win7系统有网络但是打不开网页的解决方法【图文】...
  8. 最新前端教学视频 百度网盘汇总
  9. 淘宝宝贝标题的优化设置技巧
  10. 《kafka面试100例 -6》如果在/admin/delete_topics/中手动写入一个节点会不会正常删除Topic