C#写点酷玩意,波形图控件

闲的没事,突然想起电影里那些高科技仪器,一个光点上下跳动,后面拉出精美的波形图,说干就干,
先来个效果:

我从来没写过这样的控件,所以关于某些算法都是自己想出来的,可能某些地方写的不好,还请大家指出。

 首先添加一个timer,50s

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace High_Tech_Watch
{
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}

int[] oldLine;
int SIZE = 15; //方格的大小
Pen LINEPEN
= new Pen(Color.FromArgb(3,64, 129), 1); //背景线条颜色
Pen FORELINEPEN
= new Pen(Color.LightBlue); //前景线条颜色
private void UserControl1_Paint(object sender, PaintEventArgs e)
{
Graphics g
= e.Graphics;
int Bvalue;
Bvalue
= Value;
if (shake != 0)
{
Random ro
= new Random();
int r = ro.Next(0, shake);
Value
+= (ro.Next(-shake, 0) / 2) + r/2;
if (Value>100)
{
Value
= 100;
}
if (Value < 0)
{
Value
= 0;
}
}
int h = (int)(this.Size.Height / SIZE);
int w = (int)(this.Size.Width / SIZE )+ 1;//这里加1保证了滚动时最右侧垂直线及时出现
for (; h >= 0;h-- )
{
g.DrawLine(LINEPEN,
new Point(0, h * SIZE), new Point(this.Size.Width, h * SIZE));
}
for (; w>=0;w-- )
{
g.DrawLine(LINEPEN,
new Point((w * SIZE) - limits, 0), new Point((w * SIZE) - limits, this.Size.Height));
}
for (int i = oldLine.Length - 1,j = 0;i >j ;j++ )
{
g.DrawLine(FORELINEPEN,
new Point(j,(this.Height - (int)(((float)oldLine[j] / (float)100) * (float)this.Height) ) -1),
new Point(j + 1, (this.Height - (int)(((float)oldLine[j+1] / (float)100) * (float)this.Height))-1) );
}
for (int i = oldLine.Length - 1, j = 0; i > j; j++)
{
oldLine[j]
= oldLine[j + 1];
}
oldLine[oldLine.Length
- 1] = Value;
pintLightPoint(e);
Value
= Bvalue;
}

private void pintLightPoint(PaintEventArgs e)
{
Graphics g
= e.Graphics;
g.DrawImage(
global::High_Tech_Watch.Resource1.未标题_2,new Rectangle(new Point(this.Width - 50,this.Height - (int)(((float)lightPointValue / (float)100) * (float)this.Height ) - 10),new Size(20,20)));

}

int lightPointValue = 50;
int limits = 0;//滚动就靠他了,是一个范围
private void timer1_Tick(object sender, EventArgs e)
{
limits
++;
if (limits >= SIZE)
{
limits
= 0;
}
this.Invalidate();
}

private void UserControl1_Load(object sender, EventArgs e)
{

oldLine
= new int[this.Width - 40];

}

int shake = 0;
[DefaultValue(
0),Description("抖动率,值控件输入的值自动抖动(禁用是为0)"),Category("属性值")]
public int Shake
{
get{return shake;}
set{shake = value;}
}
[DefaultValue(
0),Description("当前数值"),Category("属性值")]
public int Value
{
get { return lightPointValue; }
set { lightPointValue = value; }
}
[Description(
"当前数值"), Category("属性值")]
public Pen LinePen
{
get { return LINEPEN; }
set
{
LINEPEN
= value;
this.Invalidate();
}
}

private void UserControl1_Resize(object sender, EventArgs e)
{

if ((this.Width - 40) > oldLine.Length)
{
int[] newArry = new int[this.Width - 40];
oldLine.CopyTo(newArry, newArry.Length
- oldLine.Length);
oldLine
= new int[this.Width - 40];
oldLine
= newArry;
}
if ((this.Width - 40) < oldLine.Length)
{
int[] newArry = new int[this.Width - 40];
for (int i = newArry.Length - 1,j = oldLine.Length - 1; i >=0 ;i--,j-- )
{
newArry[i]
= oldLine[j];
}
oldLine
= new int[this.Width - 40];
oldLine
= newArry;
}

}
}
}

 还要说一点,那个点是我用Ps出来的,目前没有什么好办法写出这种发光一样效果的圆,如果谁知道,留下来

转载于:https://www.cnblogs.com/1119242459blog/archive/2011/08/19/2146309.html

基于C#波形显示控件的实现源码 计算机技术的飞速发展使得其在自动化系统中的应用日益增强。大量监控、图像数据显示软件活跃在自动化工业及自动化教学领域。同时,软件系统的日益复杂化使得模块化开发变得尤为重要。本课题所设计的基于C#波形显示控件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。 本文先介绍了.NET平台下用户控件开发的基本方法,以及用C#描述的GDI+图形开发技术,然后提出一种基于C#波形显示控件的设计思路,并对波形坐标值转换、坐标标尺、工具栏、局部放大等具体的设计细节进行详细解析。 本课题设计的波形显示控件实现了同时显示多条数据曲线、局部放大查看、波形显示自动调整最佳坐标范围、动态显示波形等功能。创新之处在于设计了一种方法,使得波形显示控件的坐标轴的起点值和终点值能够以浮点数显示,并自动根据当前波形显示控件的大小,描绘出符合用户视觉的坐标标尺。 波形显示控件实现的功能 (1) 多条波形数据的显示。 该波形显示控件能够同时显示多条波形数据,用户能够控制每条波形数据的显示颜色、线宽、线帽、以及线转折的样式。并且提供了三种波形数据显示的方式:连续数据线、离散点、条形图。 (2) 友好坐标标尺的显示。 该波形显示控件能够根据当前显示数据的坐标范围,友好地显示坐标标尺。例如X轴坐标起始值为34.2,结束坐标值为100.7,则控件不是简单得将坐标10等分并显示并不友好的坐标值,而是通过计算当前波形显示控件的大小,显示40、50……这样的友好的坐标值,并判断是否需要继续在40到50的坐标值之间显示更小分度的坐标值。 (3) 波形显示区域网格的显示。 该波形显示控件可以显示同坐标标尺的坐标线相对应的网格,使得用户能够更直观地观察波形数据。 (4) 波形的局部放大。 该波形显示控件提供了波形局部放大的功能。并根据实际使用和测试,控制了波形放大的精度,以免产生数据溢出的问题。 (5) 坐标自动调整。 该波形显示控件能够根据当前要显示的波形数据的值,自动选择最佳的坐标范围,来直观地在控件波形显示区域显示完整的波形曲线。 (6) 外观颜色方案的修改。 该波形显示控件能够修改外观样式,诸如背景色、网格颜色、坐标线颜色、坐标值颜色等都可以进行调整,以使控件外观能够符合软件整体风格。 (7) 其他细节。 该波形显示控件还设计了一个工具栏,可以方面地使用网格显示、局部放大、坐标自动调整、恢复默认坐标功能。另外还设计右键菜单,能够显示当前鼠标位置的具体坐标值,以及工具栏按钮的快捷按钮。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值