(八十七)c#Winform自定义控件-朝上的瓶子
官网
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492 
来都来了,点个【推荐】再走吧,谢谢
NuGet
Install-Package HZH_Controls
目录
http://www.hzhcontrols.com/blog-63.html
用处及效果

准备工作
之前的瓶子是朝下的,这里扩展一下 朝上
开始
增加一个属性
private Direction direction = Direction.Down; [Description("瓶子方向,默认朝下"), Category("自定义")] public Direction Direction { get { return direction; } set { direction = value; Refresh(); } } |
重绘里面判断朝上的代码
else { //写文字 var size = g.MeasureString(title, Font); g.DrawString(title, Font, new SolidBrush(ForeColor), new PointF((this.Width - size.Width) / 2, this.Height - size.Height - 2)); //画空瓶子 GraphicsPath pathPS = new GraphicsPath(); Point[] psPS = new Point[] { new Point(m_workingRect.Left + m_workingRect.Width / 4, m_workingRect.Top), new Point(m_workingRect.Right - 1- m_workingRect.Width / 4, m_workingRect.Top), new Point(m_workingRect.Right - 1, m_workingRect.Top + 15), new Point(m_workingRect.Right - 1, m_workingRect.Bottom), new Point(m_workingRect.Left , m_workingRect.Bottom), new Point(m_workingRect.Left, m_workingRect.Top + 15), }; pathPS.AddLines(psPS); pathPS.CloseAllFigures(); g.FillPath(new SolidBrush(bottleColor), pathPS); //画液体 decimal decYTHeight = (m_value / maxValue) * m_workingRect.Height; GraphicsPath pathYT = new GraphicsPath(); Rectangle rectYT = Rectangle.Empty; if (decYTHeight > m_workingRect.Height - 15) { PointF[] psYT = new PointF[] { new PointF((float)(m_workingRect.Left+(decYTHeight-(m_workingRect.Height-15)))+3,(float)(m_workingRect.Bottom-decYTHeight)), new PointF((float)(m_workingRect.Right-(decYTHeight-(m_workingRect.Height-15)))-3,(float)(m_workingRect.Bottom-decYTHeight)), new PointF(m_workingRect.Right-1, m_workingRect.Top+15), new PointF(m_workingRect.Right-1, m_workingRect.Bottom), new PointF(m_workingRect.Left, m_workingRect.Bottom), new PointF(m_workingRect.Left, m_workingRect.Top+15), }; pathYT.AddLines(psYT); pathYT.CloseAllFigures(); rectYT = new Rectangle(m_workingRect.Left + (int)(decYTHeight - (m_workingRect.Height - 15)) +1, (int)(m_workingRect.Bottom - decYTHeight - 4), m_workingRect.Width - (int)(decYTHeight - (m_workingRect.Height - 15)) * 2-2 , 10); } else { PointF[] psYT = new PointF[] { new PointF(m_workingRect.Left,(float)(m_workingRect.Bottom-decYTHeight)), new PointF(m_workingRect.Right-1,(float)(m_workingRect.Bottom-decYTHeight)), new PointF(m_workingRect.Right-1,m_workingRect.Bottom), new PointF(m_workingRect.Left,m_workingRect.Bottom), }; pathYT.AddLines(psYT); pathYT.CloseAllFigures(); rectYT = new Rectangle(m_workingRect.Left, m_workingRect.Bottom - (int)decYTHeight - 5, m_workingRect.Width, 10); } g.FillPath(new SolidBrush(liquidColor), pathYT); g.FillPath(new SolidBrush(Color.FromArgb(50, bottleMouthColor)), pathYT); //画液体面 g.FillEllipse(new SolidBrush(liquidColor), rectYT); g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), rectYT); //画高亮 int intCount = m_workingRect.Width / 2 / 4; int intSplit = (255 - 100) / intCount; for (int i = 0; i < intCount; i++) { int _penWidth = m_workingRect.Width / 2 - 4 * i; if (_penWidth <= 0) _penWidth = 1; g.DrawLine(new Pen(new SolidBrush(Color.FromArgb(10, Color.White)), _penWidth), new Point(m_workingRect.Width / 2, m_workingRect.Top + 15), new Point(m_workingRect.Width / 2, m_workingRect.Bottom)); if (_penWidth == 1) break; } //画瓶底 g.FillEllipse(new SolidBrush(liquidColor), new RectangleF(m_workingRect.Left, m_workingRect.Bottom - 5, m_workingRect.Width - 2, 10)); g.FillEllipse(new SolidBrush(Color.FromArgb(50, liquidColor)), new RectangleF(m_workingRect.Left, m_workingRect.Bottom - 5, m_workingRect.Width - 2, 10)); //画瓶口 g.FillRectangle(new SolidBrush(bottleMouthColor), new Rectangle(m_workingRect.Left + m_workingRect.Width / 4, m_workingRect.Top - 15 + 1, m_workingRect.Width / 2, 15)); //画瓶颈阴影 GraphicsPath pathPJ = new GraphicsPath(); Point[] psPJ = new Point[] { new Point(m_workingRect.Left+m_workingRect.Width/4, m_workingRect.Top), new Point(m_workingRect.Right-1-m_workingRect.Width/4, m_workingRect.Top), new Point(m_workingRect.Right-1, m_workingRect.Top+15), new Point(m_workingRect.Left, m_workingRect.Top+15) }; pathPJ.AddLines(psPJ); pathPJ.CloseAllFigures(); g.FillPath(new SolidBrush(Color.FromArgb(50, bottleMouthColor)), pathPJ); //写编号 if (!string.IsNullOrEmpty(m_NO)) { var nosize = g.MeasureString(m_NO, Font); g.DrawString(m_NO, Font, new SolidBrush(ForeColor), new PointF((this.Width - nosize.Width) / 2, m_workingRect.Bottom - nosize.Height - 10)); } } |
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧
(八十七)c#Winform自定义控件-朝上的瓶子的更多相关文章
- (十八)c#Winform自定义控件-提示框
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (四十八)c#Winform自定义控件-下拉按钮
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (七十八)c#Winform自定义控件-倒影组件
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (八)c#Winform自定义控件-分割线
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (二十八)c#Winform自定义控件-文本框(一)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- (五十八)c#Winform自定义控件-管道阀门(工业)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (六十八)c#Winform自定义控件-DEMO整理
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- (三十八)c#Winform自定义控件-圆形进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- c#Winform自定义控件-目录
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- winform 自定义控件(高手)
高手推荐:https://www.cnblogs.com/bfyx/p/11364884.html c#Winform自定义控件-目录 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件 ...
随机推荐
- Django框架——ORM执行SQL语句、神奇的双下划线、外键字段的创建、跨表查询、进阶操作
ORM执行SQL语句 有时候ORM的操作效率可能偏低 我们是可以自己编写SQL的 方式一: models.User.objects.raw('select * from app01_user') 方式 ...
- 力扣613(MySQL)-直线上的最近距离(简单)
题目: 表 point 保存了一些点在 x 轴上的坐标,这些坐标都是整数. 写一个查询语句,找到这些点中最近两个点之间的距离. 最近距离显然是 '1' ,是点 '-1' 和 '0' 之间的距离.所以输 ...
- ESXI 6.5 零基础从安装到批量生成/管理虚拟机简易教程
制造U盘安装盘 1 先提前下载好,ESXI 6.5 ISO文件. 2 下载制作U盘安装工具,RUFUS. Rufus非常小巧的绿色EXE文件,默认配置选中ISO文件就可以,点击开始,就自动制作,非常方 ...
- 阿里云荣获可信云容器安全能力先进级认证, ACK/ACR为企业级安全护航
阿里云关注企业级用户的Kubernetes生产落地痛点,结合企业生产环境的大量实践,全面帮助企业真正落地云原生架构.安全侧问题,是众多大中型或金融领域企业的核心关注点. 端到端云原生安全架构 早在20 ...
- Serverless 场景排查问题利器 : 函数实例命令行操作
简介:实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户. 背景介绍 全托管的 Serverless 计算平台能给 ...
- [Go] Golang并发控制: WaitGroup 含义和常规用法
一个 WaitGroup 等待一个 goroutine 集合的结束. 主 goroutine 调用 Add 设置需要等待的 goroutine 数量. 接下来每个 goroutine 运行并在结束时调 ...
- [ML] 工程师使用 Keras 的步骤指引
设置 import numpy as np import tensorflow as tf from tensorflow import keras 介绍 在训练模型之前准备数据(将其转换为 NumP ...
- dotnet C# 通过 Vortice 使用 Direct2D 的 ID2D1CommandList 入门
本文将告诉大家如何通过 Vortice 使用 D2D 的 CommandList 功能 本文属于 DirectX 系列博客,更多 DirectX 和 D2D 以及 Vortice 库的博客,请参阅我的 ...
- 259k+ Star!这是我见过最全的开发者技术学习路线!
大家好,我是 Java陈序员. 自从上班后,身体是一天不如一天了,也很少有时间可以去学习新技术了.程序员如果技术跟不上,很容易就被淘汰. 而碎片化的学习效率又不高,往往今天学了,明天就忘了.有时候更是 ...
- ABAP 7.58 中支持任意精度算术的新类
1. 引言 通常,有两种对编程语言的改进.第一种是让困难的事情变得简单,第二种是让不可能的事情变为可能.本文介绍的是任意精度算术,它属于第二类:使在ABAP中原本不可能的事情成为可能. 过去已经可以在 ...