📄 mymeter.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 + -