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

📄 upie.pas

📁 an example of screen savers using delphi
💻 PAS
📖 第 1 页 / 共 2 页
字号:
UNIT UPie;

INTERFACE

USES
  Windows, SysUtils, ExtCtrls, Graphics, Math, Registry, Forms, Globals;

TYPE
  TPieParas = RECORD
    ppBrushColor,
    ppBorderColor 	: TColor;
    ppBorderWidth   	: INTEGER;
    ppdStartAngle,		// bezogen auf 2 x PI
    ppdStopAngle,
    ppdRadiusX,
    ppdRadiusY,
    ppdOriginX,			// wg. MappingModes und Bitmap
    ppdOriginY,
    ppdMulX,			// wg. MappingModes und Bitmap
    ppdMulY		: DOUBLE;
    END;

  TPieRect = RECORD
    X1,
    Y1,
    X2,
    Y2 			: LONGINT;
    END;

TYPE
  TPie = CLASS( TObject )
   PRIVATE
    { Private declarations }
    myPieParas		: TPieParas;
    myBoundingRect	: TPieRect;
    myPieRect		: TPieRect;
    PROCEDURE SetStartAngle( dValue: DOUBLE );
    PROCEDURE SetStopAngle( dValue: DOUBLE );
    PROCEDURE SetRadiusX( dValue: DOUBLE );
    PROCEDURE SetRadiusY( dValue: DOUBLE );
    PROCEDURE SetOriginX( dValue: DOUBLE );
    PROCEDURE SetOriginY( dValue: DOUBLE );
    FUNCTION  ReCalculate: BOOLEAN;
   PROTECTED
    { Protected declarations }
   PUBLIC
    { Public declarations }
   PUBLISHED
    { Published declarations }
    CONSTRUCTOR Create;
    CONSTRUCTOR CreateWithParas( aTPieParas: TPieParas );			// wg. Copy
    DESTRUCTOR Destroy; OVERRIDE;
    PROPERTY BrushColor: TColor READ myPieParas.ppBrushColor WRITE myPieParas.ppBrushColor;
    PROPERTY BorderColor: TColor READ myPieParas.ppBorderColor WRITE myPieParas.ppBorderColor;
    PROPERTY BorderWidth: INTEGER READ myPieParas.ppBorderWidth WRITE myPieParas.ppBorderWidth;
    PROPERTY StartAngle: DOUBLE READ myPieParas.ppdStartAngle WRITE SetStartAngle;
    PROPERTY StopAngle: DOUBLE READ myPieParas.ppdStopAngle WRITE SetStopAngle;
    PROPERTY RadiusX: DOUBLE READ myPieParas.ppdRadiusX WRITE SetRadiusX;
    PROPERTY RadiusY: DOUBLE READ myPieParas.ppdRadiusY WRITE SetRadiusY;
    PROPERTY OriginX: DOUBLE READ myPieParas.ppdOriginX WRITE SetOriginX;
    PROPERTY OriginY: DOUBLE READ myPieParas.ppdOriginY WRITE SetOriginY;

    PROPERTY PieParas: TPieParas READ myPieParas; 				// read only
    PROPERTY BoundingRect: TPieRect READ myBoundingRect;
    PROPERTY PieRect: TPieRect READ myPieRect;
    END;


  TState	= (stON, stOff);
  TExtra	= RECORD
    xSecondsDec	: DWORD;
    xSecondsRef	: DWORD;
    xOnColor	: TColor;
    xDimColor	: TColor;
    xOffColor	: TColor;
    xBrdColor	: TColor;
    xState	: TState;
    xDimmed	: BOOLEAN;
    END;

  TBerlinPie	= CLASS(TPie)
   PRIVATE
    myExtra	: TExtra;
    PROCEDURE SetState( aState: TState );
    FUNCTION  GetDimmedColor( aColor: TColor ): TColor;
    { Private declarations }
   PROTECTED
    { Protected declarations }
   PUBLIC
    { Public declarations }
   PUBLISHED
    { Published declarations }
    CONSTRUCTOR Create;
    CONSTRUCTOR CreateWithParas( aTPieParas: TPieParas; aExtra: TExtra );	// wg. Copy
    FUNCTION  GetStateChanged( VAR aValue: DWORD ): BOOLEAN;
    PROCEDURE SetDimmed( aValue: BOOLEAN );

    PROPERTY SecondsDecrement: DWORD READ myExtra.xSecondsDec WRITE myExtra.xSecondsDec;
    PROPERTY SecondsReference: DWORD READ myExtra.xSecondsRef WRITE myExtra.xSecondsRef;
    PROPERTY State: TState READ myExtra.xState WRITE SetState;
    PROPERTY ColorOn: TColor READ myExtra.xOnColor WRITE myExtra.xOnColor;
    PROPERTY ColorDim: TColor READ myExtra.xDimColor WRITE myExtra.xDimColor;
    PROPERTY ColorOff: TColor READ myExtra.xOffColor WRITE myExtra.xOffColor;
    PROPERTY ColorBorder: TColor READ myExtra.xBrdColor WRITE myExtra.xBrdColor;
    PROPERTY Dimmed: BOOLEAN READ myExtra.xDimmed WRITE SetDimmed;
    END;


  TBerlinUhrColors = RECORD
    bucBorderColor	: TColor;
    bucHColorOn  	: TColor;
    bucHColorDim 	: TColor;
    bucHColorOff 	: TColor;
    bucMColorOn  	: TColor;
    bucMColorDim 	: TColor;
    bucMColorOff 	: TColor;
    bucSColorOn  	: TColor;
    bucSColorDim 	: TColor;
    bucSColorOff 	: TColor;
    END;

  TBerlinUhr	= CLASS( TObject )
   PRIVATE
    { Private declarations }
    myColors	: TBerlinUhrColors;
    myBitmap	: TBitmap;
    bUpdateAll	: BOOLEAN;
    bIsPainting	: BOOLEAN;
    PROCEDURE SetColors( aColors: TBerlinUhrColors );
   PROTECTED
    allPies	: ARRAY[1 .. 26] OF TBerlinPie;
    { Protected declarations }
   PUBLIC
    { Public declarations }
   PUBLISHED
    { Published declarations }
    CONSTRUCTOR Create( aColors: TBerlinUhrColors; aWidth, aHeight, aBorderWidth: INTEGER );
    DESTRUCTOR	Destroy; OVERRIDE;
    FUNCTION	GetBitmap( aDateTime: TDateTime ): TBitmap;
    PROCEDURE	DimmAll( bDimmed: BOOLEAN );
    PROCEDURE	Refresh;
    PROPERTY	Colors: TBerlinUhrColors READ myColors WRITE SetColors;
    PROPERTY	IsProcessing: BOOLEAN READ bIsPainting;
    END;

  TBerlinUhrRegEntries	= CLASS( TObject )
   PRIVATE
    myRegistry	: TRegistry;
    myDefColors	: TBerlinUhrColors;
    strKey	: STRING;
    { Private declarations }
    FUNCTION	GetBerlinUhrColors: TBerlinUhrColors;
    PROCEDURE	SetBerlinUhrColors( aColors: TBerlinUhrColors );
   PROTECTED
    { Protected declarations }
   PUBLIC
    { Public declarations }
   PUBLISHED
    { Published declarations }
    CONSTRUCTOR Create;
    DESTRUCTOR	Destroy; OVERRIDE;
    PROPERTY	BerlinUhrColors: TBerlinUhrColors READ GetBerlinUhrColors WRITE SetBerlinUhrColors;
    END;


IMPLEMENTATION

(*---------------------------------*)
CONSTRUCTOR TPie.Create;

BEGIN
INHERITED Create;
WITH myPieParas DO	// Standardwerte
  BEGIN
  ppBrushColor		:=  clYellow;
  ppBorderColor		:=  clLime;
  ppBorderWidth		:=  1;
  ppdStartAngle		:=  0.0;
  ppdStopAngle		:=  PI;
  ppdRadiusX		:=  100.0;
  ppdRadiusY		:=  50.0;
  ppdOriginX		:=  0.0;
  ppdOriginY		:=  0.0;
  ppdMulX   		:=  1.0;
  ppdMulY   		:= -1.0
  END;

ReCalculate;
END;

(*---------------------------------*)
CONSTRUCTOR TPie.CreateWithParas( aTPieParas: TPieParas );

BEGIN
INHERITED Create;
myPieParas := aTPieParas;
ReCalculate;
END;

(*---------------------------------*)
DESTRUCTOR TPie.Destroy;

BEGIN
INHERITED Destroy;
END;

(*---------------------------------*)
FUNCTION TPie.ReCalculate: BOOLEAN;

VAR
  eSin,
  eCos : EXTENDED;

BEGIN
WITH myBoundingRect, myPieParas DO
  BEGIN
  X1		:= Round( ppdOriginX-ppdRadiusX*ppdMulX );
  Y1		:= Round( ppdOriginY+ppdRadiusY*ppdMulY );
  X2		:= Round( ppdOriginX+ppdRadiusX*ppdMulX );
  Y2		:= Round( ppdOriginY-ppdRadiusY*ppdMulY );
  END;

WITH myPieRect, myPieParas DO
  BEGIN
  SinCos( ppdStartAngle, eSin, eCos );
  X1		:= Round( ppdOriginX+ppdMulX*(ppdRadiusX*eCos) );
  Y1		:= Round( ppdOriginY+ppdMulY*(ppdRadiusY*eSin) );
  SinCos( ppdStopAngle, eSin, eCos );
  X2		:= Round( ppdOriginX+ppdMulX*(ppdRadiusX*eCos) );
  Y2		:= Round( ppdOriginY+ppdMulY*(ppdRadiusY*eSin) );
  END;

Result := true;
END;

(*---------------------------------*)
PROCEDURE TPie.SetStartAngle( dValue: DOUBLE );

BEGIN
myPieParas.ppdStartAngle := dValue;
ReCalculate;
END;

(*---------------------------------*)
PROCEDURE TPie.SetStopAngle( dValue: DOUBLE );

BEGIN
myPieParas.ppdStopAngle := dValue;
ReCalculate;
END;

(*---------------------------------*)
PROCEDURE TPie.SetRadiusX( dValue: DOUBLE );

BEGIN
myPieParas.ppdRadiusX := dValue;
ReCalculate;
END;

(*---------------------------------*)
PROCEDURE TPie.SetRadiusY( dValue: DOUBLE );

BEGIN
myPieParas.ppdRadiusY := dValue;
ReCalculate;
END;

(*---------------------------------*)
PROCEDURE TPie.SetOriginX( dValue: DOUBLE );

BEGIN
myPieParas.ppdOriginX := dValue;
ReCalculate;
END;

(*---------------------------------*)
PROCEDURE TPie.SetOriginY( dValue: DOUBLE );

BEGIN
myPieParas.ppdOriginY := dValue;
ReCalculate;
END;

(*=================================*)
CONSTRUCTOR TBerlinPie.Create;

BEGIN
INHERITED Create;
WITH myExtra DO
  BEGIN
  xSecondsDec	:= 43200;		// 12Std
  xSecondsRef	:= 43200;               // 12Std
  xOnColor	:= clLime;
  xDimColor	:= clBlue;
  xOffColor	:= clMaroon;
  xState  	:= stOn;
  END;
State := State; //!!
END;

(*---------------------------------*)
CONSTRUCTOR TBerlinPie.CreateWithParas( aTPieParas: TPieParas; aExtra: TExtra );

BEGIN
INHERITED CreateWithParas( aTPieParas );
myExtra := aExtra;
END;


(*---------------------------------*)
FUNCTION  TBerlinPie.GetDimmedColor( aColor: TColor ): TColor;

BEGIN
Result := (aColor AND $FF000000)
	 +(GetBValue(aColor) SHR 1) SHL 16+
	 +(GetGValue(aColor) SHR 1) SHL  8+
	 +(GetRValue(aColor) SHR 1);
END;

(*---------------------------------*)
PROCEDURE TBerlinPie.SetState( aState: TState );

BEGIN
myExtra.xState := aState;
CASE myExtra.xState OF
  stOn	: IF myExtra.xDimmed THEN
	    myPieParas.ppBrushColor := ColorDim
	   ELSE
	    myPieParas.ppBrushColor := ColorOn;
  stOff	: IF myExtra.xDimmed THEN
	    myPieParas.ppBrushColor := GetDimmedColor(ColorOff)
	   ELSE
	    myPieParas.ppBrushColor := ColorOff;
  END;
IF myExtra.xDimmed THEN
  myPieParas.ppBorderColor := GetDimmedColor(ColorBorder)
 ELSE
  myPieParas.ppBorderColor := ColorBorder;
END;

(*---------------------------------*)
PROCEDURE TBerlinPie.SetDimmed( aValue: BOOLEAN );

BEGIN
myExtra.xDimmed := aValue;
SetState( myExtra.xState );
END;

(*---------------------------------*)
FUNCTION  TBerlinPie.GetStateChanged( VAR aValue: DWORD ): BOOLEAN;

BEGIN
IF aValue >= myExtra.xSecondsRef THEN
  BEGIN
  Dec( aValue, myExtra.xSecondsDec );
  IF myExtra.xState = stOff THEN
    BEGIN
    Result := true;
    SetState( stOn );
    END
   ELSE
    BEGIN
    Result := false;
    END;
  END
 ELSE
  BEGIN
  IF myExtra.xState = stOn THEN
    BEGIN
    Result := true;
    SetState( stOff );
    END
   ELSE
    BEGIN
    Result := false;
    END;
  END;
END;

(*=================================*)
CONSTRUCTOR TBerlinUhr.Create( aColors: TBerlinUhrColors; aWidth, aHeight, aBorderWidth: INTEGER );

VAR
  tmpExtra	: TExtra;
  tmpPieParas	: TPieParas;


BEGIN
bIsPainting	:= false;
bUpdateAll	:= true;
FillChar(tmpPieParas, SizeOf(tmpPieParas), 0);		//!!
FillChar(tmpExtra, SizeOf(tmpExtra), 0);		//!!
myBitmap       	:= TBitmap.Create;
myBitmap.Width 	:= aWidth;
myBitmap.Height	:= aHeight;

// Stunden ----------------
WITH tmpPieParas DO
  BEGIN
  ppBorderWidth		:= aBorderWidth;
  ppdStartAngle		:= 0.0;
  ppdStopAngle		:= Pi;
  ppdRadiusX		:= 0.75*Int(myBitmap.Width);
  ppdRadiusY		:= 0.75*Int(myBitmap.Height);
  ppdOriginX		:= 0.5*Int(myBitmap.Width);
  ppdOriginY		:= 0.5*Int(myBitmap.Height);
  ppdMulX  		:=  1.0;
  ppdMulY  		:= -1.0
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsDec		:= 43200;			// 12Std
  xSecondsRef		:= 43200;
  xDimmed		:= false;
  END;
allPies[1]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 0.0;
  ppdStopAngle		:= Pi;
  ppdRadiusX		:= 0.45*Int(myBitmap.Width);
  ppdRadiusY		:= 0.45*Int(myBitmap.Height);
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsDec		:= 21600;			// 6Std
  xSecondsRef		:= 21600;
  END;
allPies[2]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 2.0/5.0*Pi;
  ppdStopAngle		:= 3.0/5.0*Pi;
  ppdRadiusX		:= 0.35*Int(myBitmap.Width);
  ppdRadiusY		:= 0.35*Int(myBitmap.Height);
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsDec		:=  3600;			// 1Std
  xSecondsRef		:= 18000;
  END;
allPies[3]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 1.0/5.0*Pi;
  ppdStopAngle		:= 2.0/5.0*Pi;
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsRef		:= 14400;
  END;
allPies[4]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 3.0/5.0*Pi;
  ppdStopAngle		:= 4.0/5.0*Pi;
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsRef		:= 10800;
  END;
allPies[5]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 0.0/5.0*Pi;
  ppdStopAngle		:= 1.0/5.0*Pi;
  END;
WITH tmpExtra DO
  BEGIN
  xSecondsRef		:= 7200;
  END;
allPies[6]		:= TBerlinPie.CreateWithParas( tmpPieParas, tmpExtra );

WITH tmpPieParas DO
  BEGIN
  ppdStartAngle		:= 4.0/5.0*Pi;
  ppdStopAngle		:= 5.0/5.0*Pi;

⌨️ 快捷键说明

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