官网

http://www.hzhcontrols.com

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 

麻烦博客下方点个【推荐】,谢谢

NuGet

Install-Package HZH_Controls

目录

https://www.cnblogs.com/bfyx/p/11364884.html

用处及效果

准备工作

依然gdi+和三角函数,不懂可以先百度下

一个控制转动方向的枚举

 public enum ConveyorDirection
{
/// <summary>
/// The none
/// </summary>
None,
/// <summary>
/// The forward
/// </summary>
Forward,
/// <summary>
/// The backward
/// </summary>
Backward
}

一些控制属性

 /// <summary>
/// The conveyor color
/// </summary>
private Color conveyorColor = Color.FromArgb(, , ); /// <summary>
/// Gets or sets the color of the conveyor.
/// </summary>
/// <value>The color of the conveyor.</value>
[Description("传送带颜色"), Category("自定义")]
public Color ConveyorColor
{
get { return conveyorColor; }
set
{
conveyorColor = value;
Refresh();
}
} /// <summary>
/// The inclination
/// </summary>
private double inclination = ; /// <summary>
/// Gets or sets the inclination.
/// </summary>
/// <value>The inclination.</value>
[Description("传送带角度(-90<=value<=90)"), Category("自定义")]
public double Inclination
{
get { return inclination; }
set
{
if (value > || value < -)
return;
inclination = value;
ResetWorkingRect();
Refresh();
}
} /// <summary>
/// The conveyor height
/// </summary>
private int conveyorHeight = ; /// <summary>
/// Gets or sets the height of the conveyor.
/// </summary>
/// <value>The height of the conveyor.</value>
[Description("传送带高度"), Category("自定义")]
public int ConveyorHeight
{
get { return conveyorHeight; }
set
{
conveyorHeight = value;
ResetWorkingRect();
Refresh();
}
} /// <summary>
/// The conveyor direction
/// </summary>
private ConveyorDirection conveyorDirection = ConveyorDirection.Forward; /// <summary>
/// Gets or sets the conveyor direction.
/// </summary>
/// <value>The conveyor direction.</value>
[Description("传送带运行方向"), Category("自定义")]
public ConveyorDirection ConveyorDirection
{
get { return conveyorDirection; }
set
{
conveyorDirection = value;
if (value == HZH_Controls.Controls.ConveyorDirection.None)
{
m_timer.Enabled = false;
Refresh();
}
else
{
m_timer.Enabled = true;
}
}
} /// <summary>
/// The liquid speed
/// </summary>
private int conveyorSpeed = ; /// <summary>
/// 传送带运行速度,越小,速度越快Gets or sets the ConveyorSpeed.
/// </summary>
/// <value>The liquid speed.</value>
[Description("传送带运行速度,越小,速度越快"), Category("自定义")]
public int ConveyorSpeed
{
get { return conveyorSpeed; }
set
{
if (value <= )
return;
conveyorSpeed = value;
m_timer.Interval = value;
}
} /// <summary>
/// The m working rect
/// </summary>
Rectangle m_workingRect;
/// <summary>
/// The int line left
/// </summary>
int intLineLeft = ;
/// <summary>
/// The m timer
/// </summary>
Timer m_timer;

大小和角度改变时重算画图区域

  void UCConveyor_SizeChanged(object sender, EventArgs e)
{
ResetWorkingRect();
} /// <summary>
/// Resets the working rect.
/// </summary>
private void ResetWorkingRect()
{
if (inclination == || inclination == -)
{
m_workingRect = new Rectangle((this.Width - conveyorHeight) / , , conveyorHeight, this.Height - );
}
else if (inclination == )
{
m_workingRect = new Rectangle(, (this.Height - conveyorHeight) / + , this.Width - , conveyorHeight);
}
else
{
//根据角度计算需要的高度
int intHeight = (int)(Math.Tan(Math.PI * (Math.Abs(inclination) / 180.00000)) * (this.Width));
if (intHeight >= this.Height)
intHeight = this.Height; int intWidth = (int)(intHeight / (Math.Tan(Math.PI * (Math.Abs(inclination) / 180.00000))));
intHeight += conveyorHeight;
if (intHeight >= this.Height)
intHeight = this.Height;
m_workingRect = new Rectangle((this.Width - intWidth) / + , (this.Height - intHeight) / + , intWidth - , intHeight - );
} }

最重要的重绘

  /// <summary>
/// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var g = e.Graphics;
g.SetGDIHigh();
//g.FillRectangle(new SolidBrush(Color.FromArgb(100, conveyorColor)), m_workingRect); //轴
//左端
var rectLeft = new Rectangle(m_workingRect.Left + , (inclination >= ? (m_workingRect.Bottom - conveyorHeight) : m_workingRect.Top) + , conveyorHeight - , conveyorHeight - );
g.FillEllipse(new SolidBrush(conveyorColor), rectLeft);
g.FillEllipse(new SolidBrush(Color.White), new Rectangle(rectLeft.Left + (rectLeft.Width - ) / , rectLeft.Top + (rectLeft.Height - ) / , , ));
//右端
var rectRight = new Rectangle(m_workingRect.Right - conveyorHeight + , (inclination >= ? (m_workingRect.Top) : (m_workingRect.Bottom - conveyorHeight)) + , conveyorHeight - , conveyorHeight - );
g.FillEllipse(new SolidBrush(conveyorColor), rectRight);
g.FillEllipse(new SolidBrush(Color.White), new Rectangle(rectRight.Left + (rectRight.Width - ) / , rectRight.Top + (rectRight.Height - ) / , , )); //传送带
//左端
GraphicsPath path = new GraphicsPath();
path.AddArc(new Rectangle(m_workingRect.Left, (inclination >= ? (m_workingRect.Bottom - conveyorHeight) : m_workingRect.Top), conveyorHeight, conveyorHeight), 90F - (float)inclination, 180F);
//右端
path.AddArc(new Rectangle(m_workingRect.Right - conveyorHeight, (inclination >= ? (m_workingRect.Top) : (m_workingRect.Bottom - conveyorHeight)), conveyorHeight, conveyorHeight), - (float)inclination, 180F);
path.CloseAllFigures();
g.DrawPath(new Pen(new SolidBrush(conveyorColor), ), path); //液体流动
if (ConveyorDirection != ConveyorDirection.None)
{
Pen p = new Pen(new SolidBrush(Color.FromArgb(, this.BackColor)), );
p.DashPattern = new float[] { , };
p.DashOffset = intLineLeft * (ConveyorDirection == ConveyorDirection.Forward ? - : );
g.DrawPath(p, path);
}
}
}

完整代码

 // ***********************************************************************
// Assembly : HZH_Controls
// Created : 2019-09-05
//
// ***********************************************************************
// <copyright file="UCConveyor.cs">
// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
// </copyright>
//
// Blog: https://www.cnblogs.com/bfyx
// GitHub:https://github.com/kwwwvagaa/NetWinformControl
// gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
//
// If you use this code, please keep this note.
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.ComponentModel; namespace HZH_Controls.Controls
{
/// <summary>
/// Class UCConveyor.
/// Implements the <see cref="System.Windows.Forms.UserControl" />
/// </summary>
/// <seealso cref="System.Windows.Forms.UserControl" />
public class UCConveyor : UserControl
{
/// <summary>
/// The conveyor color
/// </summary>
private Color conveyorColor = Color.FromArgb(, , ); /// <summary>
/// Gets or sets the color of the conveyor.
/// </summary>
/// <value>The color of the conveyor.</value>
[Description("传送带颜色"), Category("自定义")]
public Color ConveyorColor
{
get { return conveyorColor; }
set
{
conveyorColor = value;
Refresh();
}
} /// <summary>
/// The inclination
/// </summary>
private double inclination = ; /// <summary>
/// Gets or sets the inclination.
/// </summary>
/// <value>The inclination.</value>
[Description("传送带角度(-90<=value<=90)"), Category("自定义")]
public double Inclination
{
get { return inclination; }
set
{
if (value > || value < -)
return;
inclination = value;
ResetWorkingRect();
Refresh();
}
} /// <summary>
/// The conveyor height
/// </summary>
private int conveyorHeight = ; /// <summary>
/// Gets or sets the height of the conveyor.
/// </summary>
/// <value>The height of the conveyor.</value>
[Description("传送带高度"), Category("自定义")]
public int ConveyorHeight
{
get { return conveyorHeight; }
set
{
conveyorHeight = value;
ResetWorkingRect();
Refresh();
}
} /// <summary>
/// The conveyor direction
/// </summary>
private ConveyorDirection conveyorDirection = ConveyorDirection.Forward; /// <summary>
/// Gets or sets the conveyor direction.
/// </summary>
/// <value>The conveyor direction.</value>
[Description("传送带运行方向"), Category("自定义")]
public ConveyorDirection ConveyorDirection
{
get { return conveyorDirection; }
set
{
conveyorDirection = value;
if (value == HZH_Controls.Controls.ConveyorDirection.None)
{
m_timer.Enabled = false;
Refresh();
}
else
{
m_timer.Enabled = true;
}
}
} /// <summary>
/// The liquid speed
/// </summary>
private int conveyorSpeed = ; /// <summary>
/// 传送带运行速度,越小,速度越快Gets or sets the ConveyorSpeed.
/// </summary>
/// <value>The liquid speed.</value>
[Description("传送带运行速度,越小,速度越快"), Category("自定义")]
public int ConveyorSpeed
{
get { return conveyorSpeed; }
set
{
if (value <= )
return;
conveyorSpeed = value;
m_timer.Interval = value;
}
} /// <summary>
/// The m working rect
/// </summary>
Rectangle m_workingRect;
/// <summary>
/// The int line left
/// </summary>
int intLineLeft = ;
/// <summary>
/// The m timer
/// </summary>
Timer m_timer;
/// <summary>
/// Initializes a new instance of the <see cref="UCConveyor"/> class.
/// </summary>
public UCConveyor()
{
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.SizeChanged += UCConveyor_SizeChanged;
this.Size = new Size(, );
m_timer = new Timer();
m_timer.Interval = ;
m_timer.Tick += timer_Tick;
m_timer.Enabled = true;
} /// <summary>
/// Handles the Tick event of the timer control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
void timer_Tick(object sender, EventArgs e)
{
intLineLeft += ;
if (intLineLeft > )
intLineLeft = ;
Refresh();
} /// <summary>
/// Handles the SizeChanged event of the UCConveyor control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
void UCConveyor_SizeChanged(object sender, EventArgs e)
{
ResetWorkingRect();
} /// <summary>
/// Resets the working rect.
/// </summary>
private void ResetWorkingRect()
{
if (inclination == || inclination == -)
{
m_workingRect = new Rectangle((this.Width - conveyorHeight) / , , conveyorHeight, this.Height - );
}
else if (inclination == )
{
m_workingRect = new Rectangle(, (this.Height - conveyorHeight) / + , this.Width - , conveyorHeight);
}
else
{
//根据角度计算需要的高度
int intHeight = (int)(Math.Tan(Math.PI * (Math.Abs(inclination) / 180.00000)) * (this.Width));
if (intHeight >= this.Height)
intHeight = this.Height; int intWidth = (int)(intHeight / (Math.Tan(Math.PI * (Math.Abs(inclination) / 180.00000))));
intHeight += conveyorHeight;
if (intHeight >= this.Height)
intHeight = this.Height;
m_workingRect = new Rectangle((this.Width - intWidth) / + , (this.Height - intHeight) / + , intWidth - , intHeight - );
} } /// <summary>
/// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var g = e.Graphics;
g.SetGDIHigh();
//g.FillRectangle(new SolidBrush(Color.FromArgb(100, conveyorColor)), m_workingRect); //轴
//左端
var rectLeft = new Rectangle(m_workingRect.Left + , (inclination >= ? (m_workingRect.Bottom - conveyorHeight) : m_workingRect.Top) + , conveyorHeight - , conveyorHeight - );
g.FillEllipse(new SolidBrush(conveyorColor), rectLeft);
g.FillEllipse(new SolidBrush(Color.White), new Rectangle(rectLeft.Left + (rectLeft.Width - ) / , rectLeft.Top + (rectLeft.Height - ) / , , ));
//右端
var rectRight = new Rectangle(m_workingRect.Right - conveyorHeight + , (inclination >= ? (m_workingRect.Top) : (m_workingRect.Bottom - conveyorHeight)) + , conveyorHeight - , conveyorHeight - );
g.FillEllipse(new SolidBrush(conveyorColor), rectRight);
g.FillEllipse(new SolidBrush(Color.White), new Rectangle(rectRight.Left + (rectRight.Width - ) / , rectRight.Top + (rectRight.Height - ) / , , )); //传送带
//左端
GraphicsPath path = new GraphicsPath();
path.AddArc(new Rectangle(m_workingRect.Left, (inclination >= ? (m_workingRect.Bottom - conveyorHeight) : m_workingRect.Top), conveyorHeight, conveyorHeight), 90F - (float)inclination, 180F);
//右端
path.AddArc(new Rectangle(m_workingRect.Right - conveyorHeight, (inclination >= ? (m_workingRect.Top) : (m_workingRect.Bottom - conveyorHeight)), conveyorHeight, conveyorHeight), - (float)inclination, 180F);
path.CloseAllFigures();
g.DrawPath(new Pen(new SolidBrush(conveyorColor), ), path); //液体流动
if (ConveyorDirection != ConveyorDirection.None)
{
Pen p = new Pen(new SolidBrush(Color.FromArgb(, this.BackColor)), );
p.DashPattern = new float[] { , };
p.DashOffset = intLineLeft * (ConveyorDirection == ConveyorDirection.Forward ? - : );
g.DrawPath(p, path);
}
}
} /// <summary>
/// Enum ConveyorDirection
/// </summary>
public enum ConveyorDirection
{
/// <summary>
/// The none
/// </summary>
None,
/// <summary>
/// The forward
/// </summary>
Forward,
/// <summary>
/// The backward
/// </summary>
Backward
}
}

开始

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

(五十七)c#Winform自定义控件-传送带(工业)-HZHControls的更多相关文章

  1. (二十五)c#Winform自定义控件-有确定取消的窗体(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  2. (四十五)c#Winform自定义控件-水波图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. (三十五)c#Winform自定义控件-下拉框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. (六十五)c#Winform自定义控件-思维导图/组织架构图(工业)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  5. (五十一)c#Winform自定义控件-文字提示-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  6. (五)c#Winform自定义控件-复选框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. (十五)c#Winform自定义控件-键盘(二)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  8. (三十五)c#Winform自定义控件-Tab页

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  9. (五十五)c#Winform自定义控件-管道

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

随机推荐

  1. 异常日志文件errorlong

    #region log ////////////////////use/////////////// /// <summary> /// 异常日志 /// </summary> ...

  2. 《Dotnet9》系列-开源C# WPF项目强力推荐

    时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...

  3. GTC 2019参会整理

    NVIDIA GTC 2019在苏州金湖国际会议中心举行,由于同事有其他会议冲突,所以我代替他来参加了此次会议.作为刚接触GPU和机器学习不久的新人来说,感觉进入了一个新世界,深刻体验到技术的革新迭代 ...

  4. Nginx代理缓存功能

    Nginx代理缓存功能      Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...

  5. python的tqdm模块介绍

    https://www.jianshu.com/p/b27318efdb7b Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息用法:tqdm(iterator) ...

  6. elementui移动dialog

    1.在创建Vue对象时添加全局属性 Vue.directive('dialogDrag', { bind(el, binding, vnode, oldVnode) { const dialogHea ...

  7. SpringCloud-创建服务消费者-Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. Odoo系统有哪些不同版本?

    来源:www.odooyun.com 1. Odoo10.0 vs Odoo11.0 vs 8.0 截至2017年底,最新的Odoo发布版为Odoo 11.0,但功能上有一定精简(去除财务模块,去除工 ...

  9. CROSS-ENV不同环境配置

    项目背景 为了适应h5环境搭建需求,需要动态配置开发,测试,生产三种对应域名及其及打包命令.使用cross-env可以让配置环境更加清晰明了还好管理. 简介 cross-env的作用是不需要全局配置N ...

  10. IOS弓箭传说的插件开发

    1.导出ipa进行解压后,定位到执行程序archero,ida加载后,发现很多都是sub_xxx开头的. 2.搜索资料后,原来Unity编写的程序,可以使用Il2CppDumper进行符号表还原. 下 ...