基于 GDI+ 的 WinForm 自定义曲线图与折线图绘制

276 阅读3分钟

前言

在开发数据可视化界面时,WinForm 提供了 Chart 控件来快速实现折线图、柱状图等图表展示。然而,在一些需要高度定制化的场景下(如动态拖动、缩放曲线图),Chart 控件的功能显得不够灵活。因此,本文将介绍如何使用 GDI+ 在 WinForm 中自定义一个支持拖动和缩放的曲线图控件,并讲解其实现原理和关键代码。

一、实现原理

自定义曲线图的核心在于继承 Control 类并重写其 OnPaint 方法。通过 Graphics 对象,我们可以手动绘制 X 轴、Y 轴以及曲线数据。为了实现拖动和缩放功能,还需要监听鼠标事件(如 MouseDownMouseMoveMouseUpMouseWheel)来更新当前显示的数据范围和坐标轴刻度。

每次绘制时,都需要重新计算当前视口的显示范围,并根据该范围调整坐标轴刻度线的位置和数值,从而实现平滑的交互体验。

关键计算逻辑

获取合适的坐标轴刻度值

为了使坐标轴的刻度为整数或易于阅读的数字(例如从 222 到 999 显示为 200 到 1000),我们需要对原始数据进行处理。具体步骤如下:

1、取对数:计算原始值的十进制位数;

2、指数运算:根据位数进行放大或缩小;

3、向上/向下取整:根据是否需要大于原值选择 Math.CeilingMath.Floor

4、还原成整数倍值:最终得到一个便于显示的整数刻度。

示例代码:

/// <summary>
/// 获取比value大的或者小的整数值
/// </summary>
/// <param name="value">要处理的值</param>
/// <param name="isBiggerThanValue">是否比value大</param>
/// <returns></returns>
private decimal GetProperValue(decimal value, bool isBiggerThanValue)
{
    var positive = value > 0 ? 1 : -1;
    //负值转换为正,正值为本身
    value = value * positive;

    var temp = value;
    int tenPowPart = 0;
    if (temp > 1)
    {
        while (temp >= 10)
        {
            tenPowPart++;
            temp = value * (decimal)Math.Pow(0.1, tenPowPart);
        }

        if (isBiggerThanValue)
        {
            temp = positive == 1 ? Math.Ceiling(temp) : Math.Floor(temp);
        }
        else
        {
            temp = positive == 1 ? Math.Floor(temp) : Math.Ceiling(temp);
        }

        var proper = positive * temp * (decimal)Math.Pow(10, tenPowPart);

        return proper;
    }
    else
    {
        while (temp < 1m && temp > 0)
        {
            tenPowPart++;
            temp = value * (decimal)Math.Pow(10, tenPowPart);
        }

        if (isBiggerThanValue)
        {
            temp = positive == 1 ? Math.Ceiling(temp) : Math.Floor(temp);
        }
        else
        {
            temp = positive == 1 ? Math.Floor(temp) : Math.Ceiling(temp);
        }
        var proper = positive * temp * (decimal)Math.Pow(0.1, tenPowPart);
        return proper;
    }
}

该方法可以智能地根据输入值返回一个“美观”的坐标轴刻度值,无论是整数还是小数都能很好地适配。

效果图

以下是部分效果截图:

总结

本文介绍了如何在 WinForm 中使用 GDI+ 实现一个支持拖动、缩放的自定义曲线图控件。虽然相比 Chart 控件来说,自定义方式在功能上存在一定局限性,但其灵活性更高,适合需要深度定制图形界面的应用场景。通过合理设计坐标轴计算逻辑,我们能够实现美观且实用的数据显示效果。

关键词

WinForm、GDI+、自定义控件、曲线图、折线图、拖动、缩放、坐标轴计算、数据可视化、C#

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:灰主流

出处:cnblogs.com/congqiandehoulai/p/14047740.html

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!