本人水平有限,如有写得不对的地方,望指正。为了简单化,做了一个简陋版的温度计控件,有点丑哈。本文的内容仅供参考
测试环境:
visual studio 2017
.net framework 4.0
效果图如下:
步骤如下:
1 新建名为WinformDemo1的winform项目,.net framework选择4.0
2 新建名为ThermometerControl的类,并编辑如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WinformDemo1
{
public class ThermometerControl:System.Windows.Forms.UserControl
{
private int _temperature = 0;
[Browsable(true), Category("自定义属性"), Description("设置温度值")]
public int Temperature
{
set { _temperature = value; Validate(); }
get { return _temperature; }
}
public ThermometerControl()
{
_temperature =25;
this.Width = 30;
}
protected override void OnPaint(PaintEventArgs e)
{
int marginLeft =25;
Graphics g = e.Graphics;
Rectangle rect = new Rectangle(0,0,this.Width,this.Height-10); // 温度计的位置和大小
// 绘制温度计的玻璃管
g.DrawRectangle(Pens.Black, rect);
g.FillRectangle(Brushes.White, rect);
// 绘制水银或指示线
int waterLevel = (int)((double)rect.Height / 100 * Temperature);
Rectangle waterRect = new Rectangle(rect.Left+ marginLeft, rect.Top + rect.Height - waterLevel, rect.Width, waterLevel);
g.FillRectangle(Brushes.Red, waterRect); // 红色表示水银或热量
// 绘制温度刻度
for (int i = 0; i <= 100; i += 10)
{
int y = rect.Top + rect.Height - (int)((double)rect.Height / 100 * i);
g.DrawLine(Pens.Black, rect.Left+ marginLeft, y, rect.Left + marginLeft+5, y);
StringFormat format = new StringFormat();
//format.Alignment = StringAlignment.Center;
//format.LineAlignment = StringAlignment.Center;
if (i > 0)
{
g.DrawString(i.ToString(), this.Font, Brushes.Black, new RectangleF(rect.Left, y, 25, 10), format);
}
}
}
}
}
3 生成项目,在工具箱中就可以看到该自定义控件了,如下图
把它拉进界面后,如下图:
3 可以设置它的属性值,Temperature属性是温度值
设置属性值时同时调用Validate()方法,会触发OnPaint方法进行重新绘制控件
好了,本文到此结束。