Delphi的TCanvas类可以实现各种复杂的图形输出功能,基于近期项目的需求,利用它实现了一个很炫的动态折线图(模拟了资源管理器中CPU使用率的折线图),可以直观地展现出数值的实时变化情况。

这段代码里边有几个核心的地方:

  • 首先是为了缓解刷新时画布闪烁,利用了双缓冲的原理;
  • 其次结合队列,保证了数据的顺序压入;
  • 还有就是一些简单的数组算法。

最终的效果如下:

单元代码如下:

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,Contnrs;
 
const
  {* 网格间隔 *}
  GridSpace = ;
  {* 移动步长(能够被间隔整除) *}
  MoveStep = ;
  {* Y轴最大值(最大刻度) *}
  MaxY = ;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Image1: TImage;
    procedure DrawPL(Shower:TImage);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  {* 网格竖线X坐标数组 *}
  GridXPArr: array of Integer;
  {* 点坐标数组 *}
  PointLst: array of TPoint;
  {* 数值队列 *}
  YPQueue: TQueue;
  {* 数值指针 *}
  PYValue: PInteger;
  {* 网格偏移量 *}
  X: Word;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  YValue:Integer;
begin
  Randomize;
  YValue := Random();
  //新Y坐标点按顺序压入队列
  New(PYValue);
  PYValue^ := YValue;
  YPQueue.Push(PYValue);
end;
 
procedure TForm1.DrawPL(Shower:TImage);
var
  Bit: TBitmap;
  i: Integer;
  PW,PH: Integer;
  YValue:Integer;
begin
  //偏移量计算
  Inc(X);
  if X = GridSpace div MoveStep then
  X := ;
  //初始化画布(双缓冲)
  Bit := TBitmap.Create;
  try
    PW := Shower.Width;
    PH := Shower.Height;
    Bit.Width := PW;
    Bit.Height := PH;
    //初始化网格竖线X坐标数组长度为宽/间隔+1
    SetLength(GridXPArr,PW div GridSpace + );
    with Bit.Canvas do
    begin
      Brush.Color := clBlack;
      Brush.Style := bsSolid;
      Rectangle(,,PW,PH);
      Pen.Color := $;
      //画网格,根据偏移量实现动态效果
      for i := to PW div GridSpace + do
      begin
        GridXPArr[i] := GridSpace * i - X * MoveStep;
        MoveTo(GridXPArr[i],);
        LineTo(GridXPArr[i],PH);
      end;
      for i := to PH div GridSpace do
      begin
        MoveTo(,GridSpace * i);
        LineTo(PW,GridSpace * i);
      end;
      //画折线
      Pen.Color := clLime;
      YValue := ;
      //如果队列中有新的Y坐标点,则输出
      if YPQueue.Count > then
      begin
        PYValue := YPQueue.Pop;
        YValue := PYValue^;
        Dispose(PYValue);
      end;
      //画笔移动到起点位置
      MoveTo(,PH);
      //每执行一次函数,Y坐标向前移动一位,并连线各个点
      for i := to Length(PointLst) - do
      begin
        PointLst[i].Y := PointLst[i + ].Y;
        LineTo(PointLst[i+].X,PointLst[i+].Y);
      end;
      //按比例更新最后一位坐标点
      PointLst[Length(PointLst)-].X := PW;
      PointLst[Length(PointLst)-].Y := PH - (YValue  * PH div MaxY);
      //打印信息(可根据需要调整显示位置和内容)
      Brush.Style:=bsClear;
      Font.Color:=clYellow;
      TextOut(,,'数值:'+inttostr(YValue));
    end;
    Shower.Canvas.Draw(,,Bit);
  finally
    Bit.Free;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
begin
  YPQueue := TQueue.Create;
  //初始化坐标点个数为宽/步长+1
  SetLength(PointLst,Image1.Width div MoveStep + );
  //初始化坐标点为X轴基线位置
  for i := to Length(PointLst) - do
  begin
    PointLst[i].X := i*MoveStep;
    PointLst[i].Y := Image1.Height;
  end;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  YPQueue.Free;
end;
 
procedure TForm1.FormShow(Sender: TObject);
begin
  DrawPL(Image1);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  DrawPL(Image1);
end;
 
end.

模拟Windows任务管理器CPU使用率的动态折线图-农夫山泉的更多相关文章

  1. achartengine画出动态折线图

    achartengine画出动态折线图的效果最近有个项目需要用到实时曲线图,我也上网搜索了一下,最后还是选择使用achartengine这个现成的东西,毕竟自己再canvas一下实在是太麻烦,而且项目 ...

  2. 原生JS实现动态折线图

    原生JS实现动态折线图 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> & ...

  3. zabbix监控windows系统CPU使用率

    参考网站:https://blog.csdn.net/reblue520/article/details/76287113 Zabbix 自带的模块没有 CPU 使用率(百分比)这个监控项,我们可以通 ...

  4. 获取Windows操作系统的CPU使用率以及内存使用率

    此功能参考了ProcessHacker项目的代码. 声明定义 typedef struct _UINT64_DELTA { ULONG64 Value; ULONG64 Delta; } UINT64 ...

  5. zabbix 监控windows端cpu使用率百分比

    参考网站:http://www.fyluo.com/?post=108 zabbix自带的模版没有CPU使用率(百分比)这个监控项,那么我们可以通过添加计数器的方式实现CPU百分比的监控. 在zabb ...

  6. 开发成功-cpu-mem监控动态折线图--dom esayui js java

    jsp ------------------------------------------------------------------------------------------- ---- ...

  7. WPF动态折线图

    此项目源码下载地址:https://github.com/lizhiqiang0204/WpfDynamicChart 效果图如下: 此项目把折线图制作成了一个控件,在主界面设置好参数直接调用即可,下 ...

  8. Echarts 动态折线图

    <script src="http://echarts.baidu.com/build/dist/echarts-all.js"></script>< ...

  9. 【转】STM32: 一种计算CPU使用率的方法及其实现原理

    1  前言出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”.本文将介绍一种计算CPU占有率的方法以及其实现原理. 2  移植 ...

随机推荐

  1. Android studio 百度地图开发(3)地图导航

    Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是Android S ...

  2. 题目3 : Fibonacci

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given a sequence {an}, how many non-empty sub-sequence of it ...

  3. 通过Lock对象以及Condition对象实现多线程同步

    通过Lock对象以及Condition对象实现多线程同步: 在之前的学习中,无论是通过synchronized建立同步代码块,还是通过synchronized建立同步函数,都是把对象看成一把锁来实现同 ...

  4. 多媒体开发之--- rtsp 中的H264 编码+打包+解码相关知识es、pes、ts...

    1)ES流(Elementary Stream): 也叫基本码流,包含视频.音频或数据的连续码流. 2)PES流(Packet Elementary Stream): 也叫打包的基本码流, 是将基本的 ...

  5. C语言基础知识【存储类】

    C 存储类1.存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前autoregisterstaticextern2.auto 只能用在函数内,即 auto ...

  6. window 怎么样让nginx开机自启动

    安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...

  7. 20179209《Linux内核原理与分析》第十二周作

    缓冲区溢出漏洞实验 缓冲区溢出简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器 ...

  8. 2017-2018-1 20179209《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程 一.实验 1.1理解编译链接的过程和ELF可执行文件格式. 1.1.1编译链接过程 能用图说明的问题,就少用文字描述: 1.1.2ELF可执行文件 ELF可执 ...

  9. 几则js表达式

    过滤大段文本里的标签.标签格式 <...>,如下匹配标签然后替换成空 校验邮箱是否符合: 去掉行首行尾空格: 检测字符串是否包含中文:(utf8编码)

  10. Android系统移植与调试之------->如何修改Android设备的桌面背景图片

    1.切换到~/mx0831-0525/device/other/TBDG1073/overlay/frameworks/base/core/res/res目录 2.准备好一张相应尺寸的图片并且命名为d ...