C#自定义波形控件

做一个类似与 任务管理器里的cpu 的波形控件

为了软件的重用 把它做成一个用户自定义控件

重写控件的OnPaint 方法

GDI+ 画 竖格 、横格  和波形  ,用指定的数组值 来控制波形的坐标位置  ,我这里用的是随机数

然后控制波形的起始位置和左移动宽度MoveWidth

添加一个 Timer  控件 在Tick 事件中 重新绘制控件,调整波形的位置

波形控件代码
   /// <summary>
    ///  作者:hzy
    ///  日期 :2013 - 4 -1 
    ///  说明:波形控件 编写一个类似与 任务管理Cpu 的波形显示
    ///  水平有待提高, 有很多的不完善,只用做 交流学习吧
    ///  实现思路 :  定义自定义控件 重写  OnPaint 方法
    ///  画出 竖格 、横格和波形,设置波形的位置
    ///  然后 定义一个Timer 控件  在Tick 事件中
    ///  重新绘制图形 并且调整 做移动的宽度  MoveWidth 
    ///  我们需要一个长度至少等于波形控件宽度的数组来存放每时刻波形的值,
    ///  因此可以确定这个数组是和控件绘图画布宽度一致的。
    ///  数组值这快还没做,为了方便用的随机数 
    ///  思路部分参考 编程中国野比的状态波形图控件
    /// </summary>
    public partial class MyBoXingControl : UserControl
    {
        private Timer myTimer;

        public Timer MyTimer
        {
            get { return myTimer; }
            set { myTimer = value; }
        }
        public MyBoXingControl()
        {
            InitializeComponent();
            //添加一个定时器
            MyTimer = new Timer();
            MyTimer.Tick += new EventHandler(MyTimer_Tick);
            this.BackColor = Color.Black;
            //this.ForeColor = Color.Lime;
        }
        
        void MyTimer_Tick(object sender, EventArgs e)
        {
            MoveWidth ++;
            Invalidate();
            //throw new NotImplementedException();
        }
       //定义向左移动的宽度
        public static int MoveWidth = 0;
        private bool isLeft=true;


        //是否左移 
        public bool IsLeft
        {
            get { return isLeft; }
            set { isLeft = value; }
        }
        /// <summary>
        /// 重写 OnPaint 方法
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {


            //定义显示格的属性
            int geWidth = 12;         //格之间的宽度
            int geXNum = this.Width / geWidth + 1;  //横向格的数目
            int geX = 0;            //x 轴 的坐标 
            int geHeight = this.Height;   // 格线的高度
            Pen pen = new Pen(Color.Green);
            //画出 竖 格
            for (int i = 0; i < geXNum+MoveWidth; i++)
            {
                // 画出  竖线    两个点坐标作为参数 
                e.Graphics.DrawLine(pen, geX - MoveWidth, 0F, geX - MoveWidth, geHeight);
                geX += geWidth;
            }

            //画出 横格

            int geYNum = this.Height / geWidth + 1; //竖向 格的数目
            int geY = 0;  //y 轴的 坐标 
            for (int l = 0; l < geYNum; l++)
            {
                //画出横向的线    两个点的坐标为参数
                e.Graphics.DrawLine(pen, 0F, geY, this.Width, geY);
                geY += geWidth;
            }

            //画出波浪
            Random rnd = new Random();
            pen.Color = Color.Lime;  //改变  画笔的颜色
            int h;
            int preY = this.Height;  //定义变量存储上一个坐标的y 轴的值

            //判断是向左移动
            if (this.isLeft)
            {
                //波形开始的位置   MoveWidth % this.Width  防止波形左移的宽度超出 本身的宽度
                int w = this.Width - MoveWidth % this.Width;
                for (int p = w; p < this.Width+w; p = p + 2)
                {

                    h = rnd.Next(1, this.Height); //随机生成一个高度  如果有指定的数据 就更好了
                    e.Graphics.DrawLine(pen, p, h, p, preY);  //画出线
                    e.Graphics.DrawLine(pen, p + 1, h, p + 1, h + 1); //P+2 中间回空一个 用一个像素来连接
                    preY = h;   //把前一个画线的起始高度  存给 preY

                }
            }
            //可以在else 处理不是左移动的代码 

            //base.OnPaint(e);
        }
    }

 

调用的时候  直接把控件放到窗体上就可以了

计数器启动    this.myBoXingControl1.MyTimer.Start();

 实现效果

 

 

 

转载于:https://www.cnblogs.com/hzy168/archive/2013/04/01/2994397.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C#波形显示件的实现源码 计算机技术的飞速发展使得其在自动化系统中的应用日益增强。大量监、图像数据显示软件活跃在自动化工业及自动化教学领域。同时,软件系统的日益复杂化使得模块化开发变得尤为重要。本课题所设计的基于C#波形显示件就可在微软.NET平台下进行代码功能重用,达到模块化开发和快速开发的目的,使得程序员能够集中精力设计软件的具体业务流程,而不必担心波形呈现的问题。 本文先介绍了.NET平台下用户件开发的基本方法,以及用C#描述的GDI+图形开发技术,然后提出一种基于C#波形显示件的设计思路,并对波形坐标值转换、坐标标尺、工具栏、局部放大等具体的设计细节进行详细解析。 本课题设计的波形显示件实现了同时显示多条数据曲线、局部放大查看、波形显示自动调整最佳坐标范围、动态显示波形等功能。创新之处在于设计了一种方法,使得波形显示件的坐标轴的起点值和终点值能够以浮点数显示,并自动根据当前波形显示件的大小,描绘出符合用户视觉的坐标标尺。 波形显示件实现的功能 (1) 多条波形数据的显示。 该波形显示件能够同时显示多条波形数据,用户能够制每条波形数据的显示颜色、线宽、线帽、以及线转折的样式。并且提供了三种波形数据显示的方式:连续数据线、离散点、条形图。 (2) 友好坐标标尺的显示。 该波形显示件能够根据当前显示数据的坐标范围,友好地显示坐标标尺。例如X轴坐标起始值为34.2,结束坐标值为100.7,则件不是简单得将坐标10等分并显示并不友好的坐标值,而是通过计算当前波形显示件的大小,显示40、50……这样的友好的坐标值,并判断是否需要继续在40到50的坐标值之间显示更小分度的坐标值。 (3) 波形显示区域网格的显示。 该波形显示件可以显示同坐标标尺的坐标线相对应的网格,使得用户能够更直观地观察波形数据。 (4) 波形的局部放大。 该波形显示件提供了波形局部放大的功能。并根据实际使用和测试,制了波形放大的精度,以免产生数据溢出的问题。 (5) 坐标自动调整。 该波形显示件能够根据当前要显示的波形数据的值,自动选择最佳的坐标范围,来直观地在件的波形显示区域显示完整的波形曲线。 (6) 外观颜色方案的修改。 该波形显示件能够修改外观样式,诸如背景色、网格颜色、坐标线颜色、坐标值颜色等都可以进行调整,以使件外观能够符合软件整体风格。 (7) 其他细节。 该波形显示件还设计了一个工具栏,可以方面地使用网格显示、局部放大、坐标自动调整、恢复默认坐标功能。另外还设计右键菜单,能够显示当前鼠标位置的具体坐标值,以及工具栏按钮的快捷按钮。
在项目程序设计的过程中,由于要求比较苛刻,这个波形件的功能有点不能满足我的需求,于是在一个风雷交加的晚上,我暗暗下定决心,面对这座大山进行代码的修改。到目前为止,我对这个件做出来了多处修改,具体修改内容如下: (1)修改了“默认坐标范围”的功能,它现在表示在接收数据的时候,横坐标范围不变,波形图像一直向左平移,且波形的结尾处一直处于波形件的右边。 (2)简化了放大波形的过程,添加了波形缩小的功能。 (3) 添加了波形拖动的功能,可以很方便的查看历史记录。 (4)添加显示曲线坐标的功能,可以很方便的显示出曲线上某一点的实际坐标,matlab风格的。 (5)添加了截图的功能。 (6) 添加了清屏的按钮。 (7)支持文件内容的读取与显示(由于显示风格比较复杂,没有把波形的储存集成到件本身,需要用外部的程序进行实现,这段代码在下边会详细介绍,代码很简单,容易实现)。 (8)支持纯链表显示(就是原件的工作模式),纯文件内容显示,链表和文件混合显示,方便对历史波形进行查看。 (9)在显示波形之前,添加了设置波形显示模式的内容,可以方便不同情况下的显示状况(这一点在下边详细介绍,在这里不做解释)。 (10)优化了部分驱动算法,删除了部分没用的代码(可能是楼主调试的时候忘了删除无用代码吧)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值