基于.net平台的自定义绘制波形控件

前段时间做项目,需要用到绘制波形控件,要求控件能够拖动坐标点的坐标,并将其更新的数据显示在表格中。

本来想网上找找,看有没有现成的,减少工作量,找了半天都没有。有网友推荐微软自家的Chart绘图控件,用了一下,没找到拖动坐标点功能,只能放弃。寻思了半天决定自己绘制此控件。

下面先展示下控件的效果:


现在来讲一下此控件的整体构思:

此控件的绘制始终以坐标轴的原点为中心进行绘制坐标轴、刻度值、坐标点。之所以选择坐标轴原点为中心,一是考虑到控件要填加鼠标拖拽坐标轴功能;而是考虑到有正负半轴,所以选坐标轴原点坐标为中心,是最好的选择,也是最佳方案。整体大的架构确定好,就可以进行绘制了,其他的附带的一些鼠标功能只需要围绕着这个大的框架做就可以了。

绘制坐标轴和刻度的Code:

#region 绘制坐标轴、刻度线刻度
        /// <summary>
        /// 绘制坐标轴、刻度线刻度
        /// </summary>
        /// <param name="g">Graphics对象</param>
        /// <param name="penXY">绘制X、Y轴画笔</param>
        /// <param name="penLine">绘制刻度线画笔</param>
        /// <param name="colorScale">刻度线刻度字体颜色</param>
        private void Draw_Coordinate_Scale(Graphics g, Pen penXY, Pen penLine, Color colorScale)
        {
            try
            {
                #region 绘制方格和坐标刻度
                switch (CoordinateMode)
                {
                    #region 横坐标模式
                    case CoordinateModeEnum.AbscissaMode:
                        #region 绘制X、Y坐标轴
                        //X轴
                        g.DrawLine(penLine, new PointF((float)(LiftMargin), AxisParameterSetS.OriginPointF.Y), new PointF((float)(this.Size.Width - RightMargin), AxisParameterSetS.OriginPointF.Y));
                        #endregion

                        #region 绘制原点坐标刻度
                        g.DrawString("0", new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)LiftMargin, AxisParameterSetS.OriginPointF.Y);
                        #endregion

                        //Y+ ---
                        for (int i = 1; i < (AxisParameterSetS.OriginPointF.Y - AboveMargin) / AxisParameterSetS.CellSize.Height; i++)
                        {
                            g.DrawString((i * CellYScale).ToString(AxisParameterSetS.ScaleDecimalPoint), new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height - ScaleFontDeviation));
                            g.DrawLine(penLine, new PointF((float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height)), new PointF((float)(this.Size.Width - RightMargin), (float)(AxisParameterSetS.OriginPointF.Y - i * AxisParameterSetS.CellSize.Height)));
                        }
                        //Y- ---
                        for (int i = 1; i < (this.Size.Height - AxisParameterSetS.OriginPointF.Y - BelowMargin) / AxisParameterSetS.CellSize.Height; i++)
                        {
                            g.DrawString((-i * CellYScale).ToString(AxisParameterSetS.ScaleDecimalPoint), new Font("微软雅黑", ScaleFontSize, FontStyle.Bold), new SolidBrush(colorScale), (float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height - ScaleFontDeviation));
                            g.DrawLine(penLine, new PointF((float)(LiftMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height)), new PointF((float)(this.Size.Width - RightMargin), (float)(AxisParameterSetS.OriginPointF.Y + i * AxisParameterSetS.CellSize.Height)));
   
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值