⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mymeter.pas

📁 本范例采用TPaintBox控件派生出仪表控件。 文件说明:PaintGrid.pas 网格型仪表控件源文件 Mymeter.pas 圆型仪表控件源文件 Project1是这两个控件的使用范
💻 PAS
字号:
unit Mymeter;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Forms,Graphics;

type
  TMymeter = class(TPaintBox)

    procedure Paint; override;
  private
    { Private declarations }
    CircleCPoint:TPoint;
    MyX,MyY,MyR,MyRw:integer;   //Myx,Myy圆心位置,MyR半径,MyRw圆弧宽度
    MyA,MyAa,MyAN:integer;//最终指向角度  ,原来的指向 ,当前指向  从MyAa循环指到MyA


    procedure PaintCir();
    procedure Paintbigdial(A:integer;Value:double); //画大刻度
    procedure Paintsmalldial(A:integer); //画小刻度    Needle
    procedure PaintNeedle(A:integer); //画指针
    procedure PanelGr(InitializeColor, TerminalColor: TColor;Pwidth,PHeight:integer; pCanvas:TCanvas);  //panel背景渐变

  protected
    { Protected declarations }

  public
    { Public declarations }
    A1,A2:integer;    //不同色彩
    ColorA1,ColorA2:integer;
    minvalue,maxvalue,Myvalue:double;
    strUint: String;
    IstemperatureMeter:Boolean;//是否温度表

    XWidth,YHeight:integer;   //Myx,Myy圆心位置,MyR半径,MyRw圆弧宽度


    constructor Create(AOwner: TComponent); override;
   // constructor Create(AOwner: String); override;
    destructor   Destroy;override;
    procedure MyPaint(MValue:double); //画指针

  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMymeter]);
end;

constructor  TMymeter.Create(AOwner: TComponent);
begin



  //Canvas.Pen.Style := bsclear;
  // A1:=60;
  // A2:=30;
  // ColorA1:=clLime;
  // ColorA2:= Clred;

  inherited;
end;

destructor   TMymeter.Destroy;
begin
  inherited   Destroy;   
end;


procedure TMymeter.PaintCir();  //画圆弧    圆心(X,Y),R1,R2半径
var
  radian: Double; {记录弧度; Sin、Cos 函数需要弧度做参数; 弧度 = 角度 * Pi/180}
  i,a,b: Integer;
begin
  Canvas.Pen.Width:=MyRw;
  Canvas.Pen.Style := psSolid;
 //   Canvas.MoveTo(MyX-MyR, MyY);
 Canvas.Pen.Color := 255;
  for i := 0 to 90 do
  begin
    if i>A1 then
     Canvas.Pen.Color := ColorA2
    else
     Canvas.Pen.Color := ColorA1;
    radian := (i-45) * (Pi/180);          {获取弧度}
    a := MyX + Round(Sin(radian) * MyR); {用 Sin 函数获取横坐标}
    b := MyY - Round(Cos(radian) * MyR); {用 Cos 函数获取纵坐标}
    if i=0 then
     Canvas.MoveTo(a, b)  //起点
    else
    Canvas.LineTo(a, b);             {绘制}
   // Application.ProcessMessages;     {不要影响其他操作}
   // Sleep(3);                        {等 3 毫秒}
  end;
 //
end;
procedure TMymeter.Paintbigdial(A:integer;Value:double); //画大刻度
var
  i,x,y,x1,y1,x2,y2,x3,y3,Len:integer;
  radian: Double;
  strtemp:string;
  IsTValue:double;
begin
  Canvas.Pen.Width:=1;
  Canvas.Pen.Color := clHighlight;
  Len:=MyR+(MyRw div 2);
  radian:= (A-45)*PI/180;
  x:=Round(Len*sin(radian));
  y:=Round(Len*cos(radian));
  x1:=Round((Len-MyRw-4)*sin(radian));
  y1:=Round((Len-MyRw-4)*cos(radian));
  if A<45 then
  begin
  x2:=Round((Len-MyRw+20)*sin(radian));
  y2:=Round((Len-MyRw+20)*cos(radian));
  x3:=Round((Len-MyRw-5)*sin(radian));
  y3:=Round((Len-MyRw-5)*cos(radian));
  end
  else
  begin
  x2:=Round((Len-MyRw)*sin(radian));
  y2:=Round((Len-MyRw+20)*cos(radian));
  x3:=Round((Len-MyRw-20)*sin(radian));
  y3:=Round((Len-MyRw-5)*cos(radian));
  end;
  Canvas.MoveTo(MyX+X1,MyY-Y1);
  Canvas.LineTo(MyX+x,MyY-y);
  Canvas.Brush.Style:=bsclear;//不覆盖背景色
  Canvas.Font.Color := clBackground;
  strtemp := format('%0.0f',[value]);
  Canvas.TextOut(MyX+X2,MyY-Y2,strtemp);
  if IstemperatureMeter then
  begin
    IsTValue := value*9 /5 +32;
    strtemp := format('%0.0f',[IsTvalue]);
    Canvas.TextOut(MyX+X3,MyY-Y3,strtemp);
  end;
end;

procedure TMymeter.Paintsmalldial(A:integer); //画小刻度
var
  i,x,y,x1,y1,Len:integer;
  radian: Double;
begin
  Canvas.Pen.Width:=1;
  Canvas.Pen.Color := clHighlight;
 // Canvas.MoveTo(MyX,MyY);
//  Len:=MyR-(MyRw div 2)-1;
  Len:=MyR+(MyRw div 2);
  radian:= (A-45)*PI/180;
  x:=Round((Len-MyRw+2)*sin(radian));
  y:=Round((Len-MyRw+2)*cos(radian));
  x1:=Round((Len-MyRw-4)*sin(radian));
  y1:=Round((Len-MyRw-4)*cos(radian));
  Canvas.MoveTo(MyX+X1,MyY-Y1);
  Canvas.LineTo(MyX+x,MyY-y);

end;

procedure TMymeter.PaintNeedle(A:integer); //画指针
var
  i,x,y,x1,y1,Len:integer;
  radian: Double;
begin
  Canvas.Pen.Width:=2;
  Canvas.Pen.Color := clBlue;
  Canvas.MoveTo(MyX,MyY);
  Len:=MyR+(MyRw div 2);
  radian:= (A-45)*PI/180;
  x:=Round((Len-MyRw-5)*sin(radian));
  y:=Round((Len-MyRw-5)*cos(radian));
  Canvas.LineTo(MyX+x,MyY-y);
end;

procedure TMymeter.Paint();  //重载Paint事件
var
  i:integer;
  strtemp:string;
  Tvalue:double;

begin
  inherited;
  // 计算仪表圆弧的圆心和半径
  if Xwidth = 0 then Xwidth := 60;
  if YHeight = 0 then YHeight := 80;

  MyX :=  Xwidth div 2;
//  MyY :=  YHeight*4 div 3;
  if ((Xwidth div 2)<(Xwidth -60 )) then
  MyR:= (Xwidth div 2)
  else
   MyR := (Xwidth -60 );


  MyY := 30 + MyR;
 // CircleCPoint := Point(MyX,MyY);

 // MyY := inty; //Trunc(Height*2/3);
  //MyR := 50;// Trunc(width/3);
  MyRw := 6;
 // DoubleBuffered:=true;//防止闪烁
  //Myvalue:=56.988;
  if (A1<0) or (A1>90) then  //A1非法输入时初始化
    A1:= 60;
  if (A2>(90-A1)) or (A2<0) then
    A2:= 30;
  Canvas.Brush.Style:=bsclear;//不覆盖背景色


   PanelGr($0060FF,clYellow,Xwidth,YHeight,Canvas);//画背景

  with Canvas do
  begin
    Font.Charset := GB2312_CHARSET ;
    Font.Size := 7;
    Font.Name := 'Tahoma';
    strtemp := format('%.1f '+strUint,[Myvalue]);
    Canvas.Brush.Style:=bsclear;//不覆盖背景色
    if NOT IstemperatureMeter then
    begin
      TextOut(MyX-15,2,strtemp);
    end
    else
    begin
      strtemp := format('%.1f '+strUint+'  %.1f F',[Myvalue,Myvalue*9 /5 +32]);
      TextOut(MyX-30,2,strtemp);
    end;
  end;
PaintCir();
   i:=0;
  while i<=90 do
  begin
   Tvalue:= minvalue+(i*(maxvalue-minvalue))/90;
  // strtemp := format('%0.0f',[Tvalue]);
   Paintbigdial(i,Tvalue);       //画大刻度
   if Not IstemperatureMeter then     //如果是温度计
   begin
   if (i+7)<=90 then
   Paintsmalldial(i+7);        //画小刻度
   end;
   i:= i+15;
  end;

    PaintNeedle(MyAN);//画指针


end;
procedure TMymeter.MyPaint(MValue:double); //指针需要摸拟从原来的位置指向新的位置
begin
//  MyA := A; //记录新位置
  MyValue := MValue;
  MyA := round((MValue-minvalue)*90/(maxvalue-minvalue));
  MyAa := MyAN;//记录原位置
  if (MyA<0)or(MyA>90) then
  MyA:=0;
  while MyAN<(MyA+5) do
  begin
    PaintNeedle(MyAN);//画指针
    inc(MyAN);
    Sleep(1);
    Refresh;
  end;
  while MyAN>(MyA) do
  begin
    PaintNeedle(MyAN);//画指针
    dec(MyAN);
    Paint();
    Application.ProcessMessages;     {不要影响其他操作}
    Sleep(1);
    Refresh;
  end;
//  Paint();

  //PaintNeedle(MyA);//画指针
end;

procedure TMymeter.PanelGr(InitializeColor, TerminalColor: TColor;Pwidth,PHeight:integer; pCanvas:TCanvas);  //panel背景渐变
var
  ARect : TRect;
  FillNumber,i:integer;
  RED,Green,Blue:integer;
begin
  for FillNumber := 0 to PHeight-1 do
    begin
      Red := GetRvalue(InitializeColor) + Trunc(FillNumber * (GetRvalue(TerminalColor) -  GetRvalue(InitializeColor)) / (PHeight - 1));
      Green := GetGvalue(InitializeColor) + Trunc(FillNumber * (GetGvalue(TerminalColor) - GetGvalue(InitializeColor)) /(PHeight - 1));
      Blue := GetBvalue(InitializeColor) + Trunc(FillNumber * (GetBvalue(TerminalColor) - GetBvalue(InitializeColor)) / (PHeight - 1));

      pCanvas.Pen.Color := RGB(Red, Green, Blue);

      pCanvas.MoveTo(0, FillNumber);
      pCanvas.LineTo(Pwidth, FillNumber);
    end;
end;



end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -