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

【制作方法】
- 找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得;
【关键节点】
- 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);
最后生成并应用


End
相关文章:
C#控件开发6—指示灯
按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边); 【制作方法】 找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得; 【关…...
探索从传统检索增强生成(RAG)到缓存增强生成(CAG)的转变
在人工智能快速发展的当下,大型语言模型(LLMs)已成为众多应用的核心技术。检索增强生成(RAG)(RAG 系统从 POC 到生产应用:全面解析与实践指南)和缓存增强生成(CAG&#x…...
【学习总结|DAY036】Vue工程化+ElementPlus
引言 在前端开发领域,Vue 作为一款流行的 JavaScript 框架,结合 ElementPlus 组件库,为开发者提供了强大的构建用户界面的能力。本文将结合学习内容,详细介绍 Vue 工程化开发流程以及 ElementPlus 的使用,助力开发者快…...
【GitHub】GitHub 2FA 双因素认证 ( 使用 Microsoft Authenticator 应用进行二次验证 )
文章目录 一、GitHub 的 2FA 双因素认证二、使用 Microsoft Authenticator 应用进行二次验证1、TOTP 应用2、下载 Microsoft Authenticator 应用3、安装使用 Authenticator 应用 三、恢复码重要性 一、GitHub 的 2FA 双因素认证 现在登录 GitHub 需要进行二次身份验证 ; 先登录…...
c# 2025/2/7 周五
13.《表达式,语句详解1》 18未完。。 表达式,语句详解_1_哔哩哔哩_bilibili...
蓝桥杯思维训练(五)
文章目录 子集II1191.K次串联后最大子数组之和 子集II 子集II 思路分析: 求解子集的问题的关键就是,通过递归与回溯,我们就是得确定以某个元素开始的子集,对于这个题目来说,比较麻烦的一点就是,存在重复的…...
I.MX6ULL 中断介绍下
GIC重点寄存器 1.中断分发器寄存器(Distributor register ) a.Distributor Control Register(中断分发控制寄存器), GICD_CTLR Purpose Enables the forwarding of pending interrupts from the Distributor to the CPU interfaces 使能将挂起的中断从…...
Elasticsearch 生产集群部署终极方案
Elasticsearch 集群部署 1.集群部署1.1 新增用户1.2 优化操作系统1.3 JDK1.4 elasticsearch1.5 开机自启动 2.安全认证功能2.1 生成CA证书2.2 生成密钥2.3 上传至其他节点2.4 修改属主、属组2.5 配置文件添加参数2.6 各节点添加密钥库密码2.7 设置用户密码 1.集群部署 1.1 新增…...
Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...
全文链接:https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型(LLMs)进行股票分析。通过使用提供的股票市场和金融新闻获取数据,结合Python中的相关库,如Pandas、langchain等,实现对股票新闻的情…...
【正点原子K210连载】第六十七章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
第六十七章 音频FFT实验 本章将介绍CanMV下FFT的应用,通过将时域采集到的音频数据通过FFT为频域。通过本章的学习,读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节: 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…...
Centos Ollama + Deepseek-r1+Chatbox运行环境搭建
Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好! 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…...
ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT
文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule: 三、拓展阅读 一、前言 2024年10月22日19:00,华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”,主题为“星河璀璨&…...
go并发和并行
进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。…...
一种解决SoC总线功能验证完备性的技术
1. 前言 通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势,也是缩短芯片开发周期,抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上,而且各IP的地址空间分配是否正确,是一件很棘手的事情。本文提出了一种新…...
Web3 与区块链:开启透明、安全的网络新时代
在这个信息爆炸的时代,我们对网络的透明性、安全性和隐私保护的需求日益增长。Web3,作为新一代互联网的代表,正携手区块链技术,引领我们走向一个更加透明、安全和去中心化的网络世界。本文将深入探讨 Web3 的基本概念、区块链技术…...
c#中Thread.Join()方法的经典示例
在 C# 中,Thread.Join 是一个非常有用的方法,它可以让主线程(调用线程)等待子线程(被调用线程)执行完毕后再继续执行。 1、经典示例1 using System; using System.Threading;public class Example {stati…...
深入了解越权漏洞:概念、危害与防范
前言 越权漏洞作为一种常见且极具威胁的安全隐患,就像隐藏在暗处的 “黑客帮凶”,时刻威胁着我们的数据安全和隐私。就让我们一起揭开越权漏洞的神秘面纱,深入了解它的来龙去脉、危害以及应对之策。 一、什么是越权漏洞 想象一下࿰…...
MySQL 数据库编程-C++
目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成:…...
dl学习笔记(9):pytorch数据处理的完整流程
1)自动导入常用库的设置方式 在开始之前,这里介绍一下自动导入常用的你需要加载的库的操作方式。 首先在我们的目录下找到ipython文件,如下图: 然后找到里面的startup文件: 然后新建一个文本文档,输入你每…...
wps中的vba开发
推荐先学习vba语言(兰色幻想80集) 保存代码时注意保存为 .xlsm(启用宏的工作簿) 子程序SUN和函数FUNCTION: Sub 第一个程序()MsgBox "这是第一个程序"End Sub 注释Sub 第二个程序()Dim str As Stringstr "这是第二个程序&…...
【HALCON实战】set_window_param:解锁图形窗口高级定制与性能调优
1. 为什么你需要掌握set_window_param? 在机器视觉项目开发中,图形窗口就像工程师的眼睛。我见过太多同行把90%的精力花在算法优化上,却忽视了窗口显示这个"最后一公里"问题。直到某次在客户现场演示时,程序因为频繁刷新…...
别再只盯着细胞比例了!用Xenium数据做小鼠肺腺癌空间邻域分析,手把手教你找到真正的肿瘤边界
空间邻域分析:重新定义肿瘤微环境的生物学边界 在单细胞和空间组学研究中,我们常常陷入一个思维定式——过度关注细胞类型的比例变化,却忽略了细胞在三维空间中的精妙排布所蕴含的关键信息。这种比例优先的思维模式,就像试图通过统…...
如何免费将OFD转PDF?Ofd2Pdf完整使用指南
如何免费将OFD转PDF?Ofd2Pdf完整使用指南 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否经常收到OFD格式的文件却无法打开?无论是电子发票、政府公文还是企业文档&…...
TinyUPnP:嵌入式设备轻量级UPnP端口映射实现
1. TinyUPnP:面向嵌入式平台的轻量级UPnP IGD客户端实现 TinyUPnP 是一个专为资源受限嵌入式系统设计的极简 UPnP(Universal Plug and Play)Internet Gateway Device(IGD)客户端库,核心目标是 在无用户干预…...
Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署
Ubuntu系统优化下的LiuJuan20260223Zimage高性能部署 本文基于Ubuntu 22.04 LTS系统测试,适用于NVIDIA GPU环境 1. 环境准备与系统优化 在开始部署LiuJuan20260223Zimage之前,我们先对Ubuntu系统进行一些基础优化,这些调整能让后续的模型运行…...
Redis持久化:从AOF到RDB,如何实现数据不丢失?
Redis属于内存数据库,但为了防止宕机等导致的数据丢失,也有对应的数据持久化技术。持久化主要作用就是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。 AOF持久化 Append Only File 类似于Mysql的binlog日志类似&…...
超越rviz_satellite:用Mapviz实现高精度SLAM地图与卫星图叠加(附开源数据集测试)
超越rviz_satellite:用Mapviz实现高精度SLAM地图与卫星图叠加(附开源数据集测试) 当自动驾驶车辆在复杂城市环境中穿行,或是无人机在未知区域执行勘探任务时,将实时构建的SLAM地图与卫星影像精准叠加,已成…...
强化学习实战:用Python手把手实现值迭代与策略迭代算法(附完整代码)
强化学习实战:用Python手把手实现值迭代与策略迭代算法(附完整代码) 强化学习作为机器学习的重要分支,近年来在游戏AI、自动驾驶、机器人控制等领域展现出惊人潜力。对于初学者而言,理解算法原理固然重要,但…...
戴森球计划FactoryBluePrints蓝图库:从新手到专家的终极工厂建设指南
戴森球计划FactoryBluePrints蓝图库:从新手到专家的终极工厂建设指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints蓝图库是戴森球计划游戏…...
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力
2025年深度评测:掌握Liebling主题,解锁Ghost博客的现代设计潜力 【免费下载链接】liebling Beautiful and clean Ghost theme that is easy and comfortable to use. To get the latest version please head over the releases page 👉&#…...
