?? 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 + -