C#自定义控件—旋转按钮
C#用户控件之旋转按钮
按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边);

【制作方法】
- 用方法找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得;
 
【关键节点】
- No.1 获取中心坐标,思考要绘制图形的相对坐标、宽度、高度;
 - No.2 更改坐标系原点,以此原点为坐标,绘制矩形开关,再旋转指定角度
 
//方法中获取原点
Point centerPoint = GetCenterPoint();
#region 获取中心原点
private Point GetCenterPoint()
{
    if (this.height > this.width)
    {
        return new Point(this.width / 2, this.width / 2);
    }
    else
    {
        return new Point(this.height / 2, this.height / 2);
    }
}
#endregion
//更改坐标系原点
g.TranslateTransform(centerPoint.X, centerPoint.Y);
//旋转指定角度
if (switchStatus)
{
    g.RotateTransform(36.0f);
}
else
{
    g.RotateTransform(-36.0f);
}
【1】按钮的背景(外环<g.DrawEllipse>、内圆<g.FillEllipse>)绘制方法与指示灯的方法一样;
注意:此坐标系以控件左上角为准
//绘制外环—(Pen)-DrawEllipse
p = new Pen(this.cirInColor, this.cirOutWidth);
RectangleF rec = new RectangleF(this.cirOutGap, this.cirOutGap, (centerPoint.X - this.cirOutGap) * 2, (centerPoint.X - this.cirOutGap) * 2);
g.DrawEllipse(p, rec);
//填充内圆—(SolidBrush)-FillEllipse
sb = new SolidBrush(this.cirInColor);
rec = new RectangleF(this.cirInGap, this.cirInGap, (centerPoint.X - this.cirInGap) * 2, (centerPoint.X - this.cirInGap) * 2);
g.FillEllipse(sb, rec);
【2】绘制中间矩形及圆点,画刷填充指定区域(g.FillRectangle、g.FillEllipse)
注意:此坐标系以中心点为准
//更改坐标系原点
g.TranslateTransform(centerPoint.X, centerPoint.Y);
//填充矩形开关
rec = new RectangleF(-this.togWidth * 0.5f, this.togGap - centerPoint.Y, togWidth, (centerPoint.Y - togGap) * 2);
g.FillRectangle(new SolidBrush(this.togColor), rec);
//填充矩形开关圆点
rec = new RectangleF(-this.togWidth * 0.5f + togForeGap, this.togGap - centerPoint.Y + togForeGap, togWidth - 2 * togForeGap, togForeHeight);
g.FillEllipse(new SolidBrush(this.togForeColor), rec);
【3】绘制文本,在指定的矩形中绘制指定的字符串(g.DrawString)
//指定字符串
rec = new RectangleF(this.width * 0.05f, 1, this.width, 20);
g.DrawString(this.textLeft, this.textFont, new SolidBrush(this.textColor), rec, sf);
rec = new RectangleF(this.width * 0.63f, 1, this.width, 20);
g.DrawString(this.textRight, this.textFont, new SolidBrush(this.textColor), rec, sf);
【4】创建鼠标点击事件,添加鼠标点击事件处理<更改属性值>,在属性中触发事件(Event)
#region 添加事件
[Browsable(true)]
[Category("操作_G")]
[Description("双击进入事件")]
public event EventHandler MouseDown_G;   //事件声明
//初始化函数添加鼠标点击事件处理
this.MouseDown += Switch_MouseDown; ;
//鼠标点击事件处理逻辑
private void Switch_MouseDown(object sender, MouseEventArgs e)
{
    DialogResult dr = MessageBox.Show("二次确认操作?", "提示您", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (dr == DialogResult.OK)
    {
        SwitchStatus = !SwitchStatus; //此处属性值,不是字段
    }
    else return;
}
#endregion
//开关状态属性
 private bool switchStatus = false;
 [Browsable(true)]
 [Category("布局_G")]
 [Description("开关状态")]
 public bool SwitchStatus
 {
     get { return switchStatus; }
     set
     {
         switchStatus = value; this.Invalidate();
         //激活触发事件
         this.MouseDown_G?.Invoke(this, null);
     }
 }
备忘:指定默认事件(在应用时点击鼠标即可进入自定义事件,否则进入‘load’事件)
[DefaultEvent("MouseDown_G")]
最后生成

下一个:一个标题面板,方便用户界面的布局

【1】新建用户组件

【2】更改组件继承为Panel

【3】定义属性(标题的颜色、字体、高度;抬头背景色;边框颜色)
private Font titleFont = new Font("微软雅黑", 12);
[Browsable(true)]
[Category("布局_G")]
[Description("标题字体")]
public Font TitleFont
{
    get { return titleFont; }
    set
    {
        titleFont = value;
        this.Invalidate();
    }
}
【4】重绘画布
//画外边框
g.DrawRectangle(new Pen(this.colorBorder), new Rectangle(0, 0, this.Width - 1, this.Height - 1));
//填充抬头矩形
RectangleF rec = new RectangleF(0.5f, 0.5f, this.Width - 2, this.titleHeight);
g.FillRectangle(new SolidBrush(this.colorBack), rec);
//文本绘制
g.DrawString(this.titleText, this.titleFont, new SolidBrush(this.colorTitle), rec, sf);
【5】备注说明
- 初始化字体格式-需要再两个方法中定义文本对齐格式
 
//字体对齐格式
this.sf = new StringFormat();
this.sf.Alignment = StringAlignment.Center;
this.sf.LineAlignment = StringAlignment.Center;
//指定控件大小
this.Size = new System.Drawing.Size(300, 150);
最后生成并应用

源码链接

(不想折腾的直接用Dll,如有更好的记得留言分享哦!代码有不足的也请大神指教)
https://pan.baidu.com/s/1QM_iZ-UMksPqwWo2ssS5Ow?pwd=ju01
End
C#自定义控件—旋转按钮的更多相关文章
- [MicroPython]TurniBit开发板旋转按钮控制脱机摆动
		
一.实验目的: ?学习在PC机系统中扩展简单I/O 接口的方法 ?学习TurnipBit拼插编程 ?了解舵机工作原理 ?学习TurnipBit扩展板舵机和旋转按钮接线方式 二.所需原器件: ?Turn ...
 - Micropython Turnipbit  换挡风扇 旋转按钮控制直流电机转速
		
学过物理学的我们都知道换挡风扇的原理,一般按钮控制电感分压或者电容分压,以达到控制电流的目的.那么我们可不可以使用Turnipbit模拟这个系统呢?其实是很简单的.类似于之前用Tpyboard做的智能 ...
 - [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
		
1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...
 - CSS3 3D旋转按钮对话框
		
在线演示 本地下载
 - iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果
		
一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...
 - IOS第18天(10,核心动画-转盘,自定义buton,旋转动画)
		
*****HMViewController.m #import "HMViewController.h" #import "HMWheelView.h" @in ...
 - C# 图片盖章功能实现,支持拖拽-旋转-放缩-保存
		
实现图片盖章功能,在图片上点击,增加“图章”小图片,可以拖拽“图章”到任意位置,也可以点击图章右下角园框,令图片跟着鼠标旋转和放缩. 操作方法:1.点击增加“图章”2.选中移动图标3.点中右下角放缩旋 ...
 - Discuz!图片查看插件(支持鼠标缩放、实际大小、旋转、下载)
		
Discuz!图片查看插件(支持鼠标缩放.实际大小.旋转.下载) 图片查看是网站中的常用功能,用于展示详细的图片.在discuz图片插件的基础上进行了改造,因此这篇文章主要从以下几个方面来讨论图片查看 ...
 - Bitmap与Matrix旋转ImageView
		
Bitmap与Matrix旋转ImageView 标签: matrixfloatbutton测试importlayout 2010-08-23 22:18 8569人阅读 评论(0) 收藏 举报 分 ...
 - 【Unity编程】Unity中的欧拉旋转
		
欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自维基百科的定义,我这里也引述一下: 维基百科定义 莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向.对于任何参 ...
 
随机推荐
- mac idea 更换主题
			
使用 主题一 xcode-dark-theme:点我直达 主题二 one-dark-theme:点我直达 主题三 dark-purple-theme:点我直达 主题四(推荐) vuesion-them ...
 - mac navicat免激活版
			
Navicat 12 第一步:终端执行 sudo spctl --master-disable 第二步:下载安装即可使用 https://pan.baidu.com/s/1tHq-wqAIggD0Fo ...
 - Navicat for mysql 无法连接到虚拟机的linux系统下的mysql
			
最近在linux Centos7版本的虚拟机上安装了一个MySql数据库,发现本地可以正常ping通虚拟机,但Navicat则无法正常连接到虚拟机里的MySql数据库,经过一番琢磨,发现解决这个问题的 ...
 - Java Redis多限流
			
Java Redis多限流 在Java中实现Redis多限流通常涉及使用Redis的某些特性,如INCR.EXPIRE.Lua脚本或者更高级的Redis数据结构如Redis Bitmaps.Redis ...
 - 用户数据报协议UDP
			
UDP的首部格式如下: (1) 源端口,源端口号.在需要对方回信时选用.不需要时可用全0. ⑵目的端口,目的端口号.这在终点交付报文时必须使用. ⑶长度,UDP用户数据报的长度,其最小值是8(仅有首部 ...
 - npm ERR! `perfix` is not a valid npm option
			
全局路径cmd命令:npm config set perfix "D:\Program Files\nodejs\node_global" 缓存路径cmd命令:npm config ...
 - [oeasy]python0067_ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI
			
光标位置 回忆上次内容 上次了解了 新的转义模式 \33 逃逸控制字符 esc 这个字符让输出退出标准输出流 进行控制信息的设置 可以设置光标输出的位置 ASR33中的ALT MODE 是 今天的ES ...
 - vue3基础学习
			
第一章:vue3.0基础 1,认识vue3.0 vue3.0发布时间为2020-9-18,从项目体验上,vue3.0比起vue2.0有以下优势: 打包大小减少41% 初次渲染块55%,更新渲染块133 ...
 - vue codemirror sql编辑器功能 可自定义提醒(关键字,库名,表名),高亮,主题
			
工作中再一次需要开发sql编辑器,优化上篇文章内容 https://www.cnblogs.com/Lu-Lu/p/14388888.html 本次功能是tab页打开多个sql编辑器,效果图: 安装: ...
 - 【JS】04 DOM 文档对象模型 P1 查找元素、改变内容、绑定事件
			
什么是DOM? Document Object Model 文档指的是HTML文档 当浏览器打开一个网页的时候,实际上把HTML文档读取到内存中进行解析 整个HTML文档被封装为document文档对 ...