C# Winform 自定义带SWITCH的卡片
1、创建卡片用户控件
在控件库中添加用户控件(Windows窗体),命名为Card;
在属性/布局栏设置Size为148,128.
2、修改Card.cs
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 UserControlLib
{
public partial class Card : UserControl
{
public Card()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.Selectable, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.MouseDown += UcSwitch_MouseDown;
}
[Description("开关切换"), Category("自定义")]public event EventHandler CheckedChanged;void UcSwitch_MouseDown(object sender, MouseEventArgs e){int xMin = switchLocationX - swichArcDiameter;int xMax = switchLocationX + swichLineLen + swichArcDiameter;int yMin= switchLocationY;int yMax = switchLocationY + swichArcDiameter;if (e.X > xMin && e.X < xMax && e.Y > yMin && e.Y < yMax){ChipSwitch = !ChipSwitch;if (CheckedChanged != null){CheckedChanged(this, EventArgs.Empty);}}}private const int SWITCH_ARC_DIAMETER = 24;private const int SWITCH_LINE_LEN = 15;private const int SWITCH_LOCATION_X = 85;private const int SWITCH_LOCATION_Y = 5;int swichArcDiameter = SWITCH_ARC_DIAMETER;int swichLineLen = SWITCH_LINE_LEN;int switchLocationX = SWITCH_LOCATION_X;int switchLocationY = SWITCH_LOCATION_Y;string[] segment;protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);var g = e.Graphics;g.SmoothingMode=SmoothingMode.AntiAlias;g.DrawString(this.ChipName,new Font("Yahei", 12f), new SolidBrush(Color.White),5,5);var fillColor = this.ChipSwitch ? Color.FromArgb(34, 163, 169) : Color.FromArgb(111, 122, 126);GraphicsPath path = new GraphicsPath();path.AddLine(new Point(switchLocationX, switchLocationY), new Point(switchLocationX + swichLineLen, switchLocationY));//g.DrawPath(new Pen(Color.Red,2),path);path.AddArc(new Rectangle(switchLocationX + swichLineLen, switchLocationY, swichArcDiameter, swichArcDiameter), -90, 180);//g.DrawPath(new Pen(Color.Red, 2), path);path.AddLine(new Point(switchLocationX + swichLineLen, switchLocationY + swichArcDiameter), new Point(switchLocationX, switchLocationY + swichArcDiameter));//g.DrawPath(new Pen(Color.Red, 2), path);path.AddArc(new Rectangle(switchLocationX - swichArcDiameter, switchLocationY, swichArcDiameter, swichArcDiameter), 90, 180);//g.DrawPath(new Pen(Color.Red, 2), path);g.FillPath(new SolidBrush(fillColor), path);int switchCircleDiameter = swichArcDiameter - 4;int switchTextY = (swichArcDiameter - 10) / 2+ switchLocationY;if (this.ChipSwitch){g.FillEllipse(Brushes.White, new Rectangle(switchLocationX + swichLineLen+2, switchLocationY+2, switchCircleDiameter, switchCircleDiameter));g.DrawString("开", new Font("Yahei", 10f), Brushes.White, new Point(switchLocationX, switchTextY));}else{g.FillEllipse(Brushes.White, new Rectangle(switchLocationX - swichArcDiameter+2, switchLocationY+2, switchCircleDiameter, switchCircleDiameter));g.DrawString("关", new Font("Yahei", 10f), Brushes.White, new Point(switchLocationX, switchTextY));}if (segment!=null && segment.Length>0){for(int i=0;i<segment.Length; i++){g.DrawString(segment[i], new Font("Yahei", 10f), new SolidBrush(Color.White), 5, 40+25*i);//g.DrawString(this.LatchCount, new Font("Yahei", 12f), new SolidBrush(Color.Blue), 100, 65);}}}#region Propertiesprivate string chipName;[Description("芯片名称"), Category("自定义")]public string ChipName{get { return chipName; }set { chipName = value; Invalidate(); }}private bool chipSwitch;[Description("芯片开关"), Category("自定义")]public bool ChipSwitch{get { return chipSwitch; }set { chipSwitch = value; Invalidate(); }}private string content;[Description("卡片内容"), Category("自定义")]public string Content{get { return content; }set { content = value;if(content != null){segment = content.Split(',');}Invalidate();}}//private int statusColor;//[Description("背景颜色"), Category("自定义")]//public int StatusColor//{// get { return statusColor; }// set { // statusColor = value;// switch (statusColor)// {// case 1:// this.BackColor = Color.FromArgb(0xFFD965);// break;// case 2:// this.BackColor = Color.FromArgb(0xC55A11); // break;// default:// this.BackColor = Color.FromArgb(0x70AD47);// break;// }// }//}#endregion
}
}
相关文章:
C# Winform 自定义带SWITCH的卡片
1、创建卡片用户控件 在控件库中添加用户控件(Windows窗体),命名为Card; 在属性/布局栏设置Size为148,128. 2、修改Card.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u…...
我用Devchat开发了公务员报名确认系统自动登录脚本,再也不用担心挤不进去了
#AI编程助手哪家好?DevChat“真”好用 # 演示效果 我用Devchat开发了公务员报名确认系统自动登录,再也不用担心挤不进去了 目录 演示效果前言粉丝独家专属红包码DevChat是什么?DevChat AI编程助手有哪些优势一、安装Vscode1、下载vscode链接…...
如何低门槛开发有趣实用的ZigBee产品?
一、什么是 Zigbee 协议? Zigbee 技术是一种连接距离短、功耗低、复杂程度低、数据传输量低的无线通信技术,其命名灵感源自于蜜蜂在群体中的信息传输。它主要通过网关与互联网进行通信,并嵌入各种智能设备,最终实现自动控制和远程…...
ChatGPT和API发生重大中断!
11月9日凌晨,OpenAI在官网发布,ChatGPT和API发生重大中断,导致全球所有用户无法正常使用,宕机时间超过2小时。 目前,OpenAI已经找到问题所在并进行了修复,但仍然不稳定,会继续进行安全监控。 …...
SQL第五次上机实验
1.向图书表(Book)插入以下记录 USE TSGL GO INSERT INTO Book VALUES(7-5402-1800-3,文学类,边城,沈从文,燕山出版社,10,5,5)2.向借阅表插入以下两条记录 USE TSGL GO INSERT INTO Lend VALUES(201207034201,7-5402-1800-3,00366240,2013-04-22),(2012…...
Matplotlib数据可视化综合应用Matplotlib图形配置在线闯关_头歌实践教学平台
Matplotlib数据可视化综合应用图形配置 第1关 配置颜色条第2关 设置注释第3关 自定义坐标刻度第4关 配置文件与样式表 第1关 配置颜色条 任务描述 本关任务:使用colorbar绘制一个热成像图。 编程要求 在右侧编辑器Begin-End处补充代码,根据输入数据绘制…...
CSS实现瀑布流的两种方式
column 多行布局实现瀑布流 1.column 实现瀑布流主要依赖两个属性。 2.column-count 属性,是控制屏幕分为多少列。 3.column-gap 属性,是控制列与列之间的距离。 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…...
Hadoop 视频分析系统
视频分析系统 业务流程 原始数据 vedio.json {"rank":1,"title":"《逃出大英博物馆》第二集","dzl":"77.8","bfl":"523.9","zfl":"39000","type":"影视",&quo…...
Flutter android和ios闪屏页配置
一.概念理解 闪屏页 1.当点击app开始的一瞬间,所呈现出来的页面就是闪屏页。 2.为什么会有闪屏也,由于app启动需要加载代码,这个过程需要耗时,在没有加载完成之前,是看不到app真正的页面。所以app在没有完全加载完时…...
30道高频Vue面试题快问快答
※其他的快问快答,看这里! 10道高频Qiankun微前端面试题快问快答 10道高频webpack面试题快问快答 20道高频CSS面试题快问快答 20道高频JavaScript面试题快问快答 30道高频Vue面试题快问快答 面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过…...
vue-前端实现模糊查询
vue-前端实现模糊查询 开始觉得前端的模糊查询肯定是非常难实现的,但后来发现还是很容易的,几行代码就可以搞定。 原理 从后端获取到所有数据后,将数据存储于两个变量中,目的是为了其中一个作为模糊查询的对照组,用…...
QT:tcpSocket 报错The proxy type is invalid for this operation
调用connectToHost时会先检查代理情况。Qt 程序默认使用系统的代理设置会导致这个问题导致,只要关闭系统的代理设置就可以解决这个问题: (1)添加头文件: #include <QNetworkProxy> (2)添加…...
PostgreSQL 技术内幕(十一)位图扫描
扫描算子在上层计算和底层存储之间,向下扫描底层存储的数据,向上作为计算的输入源,在SQL的执行层中,起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而,扫描算子背后的实现原理是怎样…...
C# WebSocket 服务器
*******************websocket服务器************************************** 第一步:创建HttpListener类,并启动监听: var listener new HttpListener(); listener.Prefixes.Add("http://10.10.13.140:8080/"); …...
自动化实战 - 测试个人博客系统
前言 本篇使用Selenium3Junit5对个人博客进行自动化测试,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言一.web自动化测试用例二.测试准备1.注册界面自动化测试测试过程中遇到的Bug: 2.登录界面自动…...
TCP/IP详解
TCP/IP详解 一、网络基础1.TCP/IP网络分层2.IP地址和端口号3.封装与分用4.客户-服务端模型 二、链路层1.以太网IEEE802封装2.环回接口 Loopback Interface3.最大传输单元MTU和路径MTU 三、网络层 - IP1.IP首部的关键信息2.IP路由选择3.子网寻址和子网掩码4.ICMP和IGMP 四、传输…...
2023年的低代码:数字化、人工智能、趋势及未来展望
前言 正如许多专家预测的那样,低代码平台在2023年将展现更加强劲的势头。越来越多的企业正在纷纷转向低代码开发,他们希望能够快速开发内部应用程序,并在经济衰退可能出现的情况下保持灵活性。在这个大背景下,低代码平台为企业软件…...
【gogogo专栏】golang并发编程
golang并发编程 并发编程的工具goroutine介绍协程管理器sync.WaitGroup channel介绍readChannel和writeChannelclose的用法select的用法 通讯示例总结 并发编程的工具 在golang中,并发编程是比较简单的,不像java中那么麻烦,golang天然的支持协…...
深入理解JVM虚拟机第二十二篇:详解JVM当中与操作数栈相关的字节码指令
大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻J…...
Vue报错解决Error in v-on handler: “Error: 无效的节点选择器:#div1“
因为我们在创建元素之前用了#div1"所有它会报错,解决方案简单粗暴咱们直接用 setTimeout(createEdit, 1)解决问题了 原理:vue的虚拟dom创建完成以后再调用真是dom就没啥问题 function createEdit() {const editor new E(#div1)editor.config.hei…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
