VrLevelBar.pas
上传用户:hbszzs
上传日期:2008-08-20
资源大小:628k
文件大小:12k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrLevelBar;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   VrTypes, VrClasses, VrControls, VrSysUtils;
  15. type
  16.   TVrLevelBar = class(TVrGraphicImageControl)
  17.   private
  18.     FMinValue: Integer;
  19.     FMaxValue: Integer;
  20.     FPosition: Integer;
  21.     FPercent1: TVrPercentInt;
  22.     FPercent2: TVrPercentInt;
  23.     FPalette1: TVrPalette;
  24.     FPalette2: TVrPalette;
  25.     FPalette3: TVrPalette;
  26.     FBevel: TVrBevel;
  27.     FOrientation: TVrOrientation;
  28.     FSpacing: Integer;
  29.     FTickHeight: Integer;
  30.     FStyle: TVrProgressStyle;
  31.     FStep: Integer;
  32.     FOnChange: TNotifyEvent;
  33.     FOnMinValue: TNotifyEvent;
  34.     FOnMaxValue: TNotifyEvent;
  35.     FViewPort: TRect;
  36.     FTickStep, FTicks: Integer;
  37.     function GetPercentDone: Longint;
  38.     procedure SetMinValue(Value: Integer);
  39.     procedure SetMaxValue(Value: Integer);
  40.     procedure SetPosition(Value: Integer);
  41.     procedure SetPalette1(Value: TVrPalette);
  42.     procedure SetPalette2(Value: TVrPalette);
  43.     procedure SetPalette3(Value: TVrPalette);
  44.     procedure SetBevel(Value: TVrBevel);
  45.     procedure SetOrientation(Value: TVrOrientation);
  46.     procedure SetSpacing(Value: Integer);
  47.     procedure SetTickHeight(Value: Integer);
  48.     procedure SetPercent1(Value: TVrPercentInt);
  49.     procedure SetPercent2(Value: TVrPercentInt);
  50.     procedure SetStyle(Value: TVrProgressStyle);
  51.     procedure DrawHori;
  52.     procedure DrawVert;
  53.     procedure PaletteModified(Sender: TObject);
  54.     procedure BevelChanged(Sender: TObject);
  55.   protected
  56.     procedure CalcPaintParams;
  57.     procedure Paint; override;
  58.     procedure Changed; dynamic;
  59.   public
  60.     constructor Create(AOwner: TComponent); override;
  61.     destructor Destroy; override;
  62.     procedure StepIt;
  63.     procedure StepBy(Delta: Integer);
  64.     property PercentDone: Longint read GetPercentDone;
  65.   published
  66.     property MaxValue: Integer read FMaxValue write SetMaxValue default 100;
  67.     property MinValue: Integer read FMinValue write SetMinValue default 0;
  68.     property Position: Integer read FPosition write SetPosition default 0;
  69.     property Percent1: TVrPercentInt read FPercent1 write SetPercent1 default 60;
  70.     property Percent2: TVrPercentInt read FPercent2 write SetPercent2 default 25;
  71.     property Palette1: TVrPalette read FPalette1 write SetPalette1;
  72.     property Palette2: TVrPalette read FPalette2 write SetPalette2;
  73.     property Palette3: TVrPalette read FPalette3 write SetPalette3;
  74.     property Bevel: TVrBevel read FBevel write SetBevel;
  75.     property Orientation: TVrOrientation read FOrientation write SetOrientation default voVertical;
  76.     property Spacing: Integer read FSpacing write SetSpacing default 1;
  77.     property TickHeight: Integer read FTickHeight write SetTickHeight default 1;
  78.     property Style: TVrProgressStyle read FStyle write SetStyle default psBottomLeft;
  79.     property Step: Integer read FStep write FStep default 10;
  80.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  81.     property OnMinValue: TNotifyEvent read FOnMinValue write FOnMinValue;
  82.     property OnMaxValue: TNotifyEvent read FOnMaxValue write FOnMaxValue;
  83. {$IFDEF VER110}
  84.     property Anchors;
  85.     property Constraints;
  86. {$ENDIF}
  87.     property Color default clBlack;
  88.     property DragCursor;
  89. {$IFDEF VER110}
  90.     property DragKind;
  91. {$ENDIF}
  92.     property DragMode;
  93.     property ParentColor default false;
  94.     property ParentShowHint;
  95.     property PopupMenu;
  96.     property ShowHint;
  97.     property Visible;
  98.     property OnClick;
  99. {$IFDEF VER130}
  100.     property OnContextPopup;
  101. {$ENDIF}    
  102.     property OnDblClick;
  103.     property OnDragDrop;
  104.     property OnDragOver;
  105. {$IFDEF VER110}
  106.     property OnEndDock;
  107. {$ENDIF}
  108.     property OnEndDrag;
  109.     property OnMouseDown;
  110.     property OnMouseMove;
  111.     property OnMouseUp;
  112. {$IFDEF VER110}
  113.     property OnStartDock;
  114. {$ENDIF}
  115.     property OnStartDrag;
  116.   end;
  117. implementation
  118. constructor TVrLevelBar.Create(AOwner: TComponent);
  119. begin
  120.   inherited Create(AOwner);
  121.   ControlStyle := ControlStyle + [csOpaque];
  122.   Width := 20;
  123.   Height := 170;
  124.   ParentColor := false;
  125.   Color := clBlack;
  126.   FOrientation := voVertical;
  127.   FSpacing := 1;
  128.   FTickHeight := 1;
  129.   FMinValue := 0;
  130.   FMaxValue := 100;
  131.   FPosition := 0;
  132.   FPercent1 := 60;
  133.   FPercent2 := 25;
  134.   FStyle := psBottomLeft;
  135.   FStep := 10;
  136.   FPalette1 := TVrPalette.Create;
  137.   FPalette1.OnChange := PaletteModified;
  138.   FPalette2 := TVrPalette.Create;
  139.   with FPalette2 do
  140.   begin
  141.     Low := clOlive;
  142.     High := clYellow;
  143.     OnChange := PaletteModified;
  144.   end;
  145.   FPalette3 := TVrPalette.Create;
  146.   with FPalette3 do
  147.   begin
  148.     Low := clMaroon;
  149.     High := clRed;
  150.     OnChange := PaletteModified;
  151.   end;
  152.   FBevel := TVrBevel.Create;
  153.   with FBevel do
  154.   begin
  155.     InnerStyle := bsLowered;
  156.     InnerWidth := 2;
  157.     InnerColor := clBlack;
  158.     OnChange := BevelChanged;
  159.   end;
  160. end;
  161. destructor TVrLevelBar.Destroy;
  162. begin
  163.   FBevel.Free;
  164.   FPalette1.Free;
  165.   FPalette2.Free;
  166.   FPalette3.Free;
  167.   inherited Destroy;
  168. end;
  169. procedure TVrLevelBar.PaletteModified(Sender: TObject);
  170. begin
  171.   UpdateControlCanvas;
  172. end;
  173. procedure TVrLevelBar.BevelChanged(Sender: TObject);
  174. var
  175.   R: TRect;
  176. begin
  177.   if not Loading then
  178.   begin
  179.     R := ClientRect;
  180.     FBevel.GetVisibleArea(R);
  181.     InflateRect(FViewPort, R.Left, R.Top);
  182.     BoundsRect := Bounds(Left, Top, WidthOf(FViewPort),
  183.       HeightOf(FViewPort));
  184.   end;
  185.   UpdateControlCanvas;
  186. end;
  187. procedure TVrLevelBar.Changed;
  188. begin
  189.   if Assigned(FOnChange) then FOnChange(Self);
  190.   if (Position = MinValue) and (Assigned(FOnMinValue)) then FOnMinValue(Self);
  191.   if (Position = MaxValue) and (Assigned(FOnMaxValue)) then FOnMaxValue(Self);
  192. end;
  193. procedure TVrLevelBar.StepIt;
  194. begin
  195.   Position := Position + FStep;
  196. end;
  197. procedure TVrLevelBar.StepBy(Delta: Integer);
  198. begin
  199.   Position := Position + Delta;
  200. end;
  201. function TVrLevelBar.GetPercentDone: Longint;
  202. begin
  203.   Result := SolveForY(FPosition - FMinValue, FMaxValue - FMinValue);
  204. end;
  205. procedure TVrLevelBar.DrawHori;
  206. var
  207.   R: TRect;
  208.   X, Y, I, Offset: Integer;
  209.   TicksOn, TicksOff: Integer;
  210.   Point, Point1, Point2: Integer;
  211. begin
  212.   TicksOn := SolveForX(PercentDone, FTicks);
  213.   TicksOff := FTicks - TicksOn;
  214.   Point1 := SolveForX(Percent1, FTicks);
  215.   Point2 := Point1 + SolveForX(Percent2, FTicks);
  216.   Y := FViewPort.Top;
  217.   if FStyle = psBottomLeft then
  218.   begin
  219.     X := FViewPort.Left;
  220.     Offset := FTickStep;
  221.   end
  222.   else
  223.   begin
  224.     X := FViewPort.Right - FTickHeight;
  225.     Offset := -FTickStep;
  226.   end;
  227.   R := Bounds(X, Y, FTickHeight, HeightOf(FViewPort));
  228.   Point := 0;
  229.   for I := 1 to TicksOn do
  230.   begin
  231.     Inc(Point);
  232.     if Point <= Point1 then BitmapCanvas.Brush.Color := FPalette1[1]
  233.     else if Point <= Point2 then BitmapCanvas.Brush.Color := FPalette2[1]
  234.     else BitmapCanvas.Brush.Color := FPalette3[1];
  235.     BitmapCanvas.FillRect(R);
  236.     OffsetRect(R, Offset, 0);
  237.   end;
  238.   for I := 1 to TicksOff do
  239.   begin
  240.     Inc(Point);
  241.     if Point <= Point1 then BitmapCanvas.Brush.Color := FPalette1[0]
  242.     else if Point <= Point2 then BitmapCanvas.Brush.Color := FPalette2[0]
  243.     else BitmapCanvas.Brush.Color := FPalette3[0];
  244.     BitmapCanvas.FillRect(R);
  245.     OffsetRect(R, Offset, 0);
  246.   end;
  247. end;
  248. procedure TVrLevelBar.DrawVert;
  249. var
  250.   R: TRect;
  251.   X, Y, I, Offset: Integer;
  252.   TicksOn, TicksOff: Integer;
  253.   Point, Point1, Point2: Integer;
  254. begin
  255.   TicksOn := SolveForX(PercentDone, FTicks);
  256.   TicksOff := FTicks - TicksOn;
  257.   Point1 := SolveForX(Percent1, FTicks);
  258.   Point2 := Point1 + SolveForX(Percent2, FTicks);
  259.   X := FViewPort.Left;
  260.   if FStyle = psBottomLeft then
  261.   begin
  262.     Y := FViewPort.Top;
  263.     Offset := FTickStep;
  264.   end
  265.   else
  266.   begin
  267.     Y := FViewPort.Bottom - FTickHeight;
  268.     Offset := -FTickStep;
  269.   end;
  270.   R := Bounds(X, Y, WidthOf(FViewPort), FTickHeight);
  271.   Point := FTicks;
  272.   for I := 1 to TicksOff do
  273.   begin
  274.     Dec(Point);
  275.     if Point < Point1 then BitmapCanvas.Brush.Color := FPalette1[0]
  276.     else if Point < Point2 then BitmapCanvas.Brush.Color := FPalette2[0]
  277.     else BitmapCanvas.Brush.Color := FPalette3[0];
  278.     BitmapCanvas.FillRect(R);
  279.     OffsetRect(R, 0, Offset);
  280.   end;
  281.   for I := 1 to TicksOn do
  282.   begin
  283.     Dec(Point);
  284.     if Point < Point1 then BitmapCanvas.Brush.Color := FPalette1[1]
  285.     else if Point < Point2 then BitmapCanvas.Brush.Color := FPalette2[1]
  286.     else BitmapCanvas.Brush.Color := FPalette3[1];
  287.     BitmapCanvas.FillRect(R);
  288.     OffsetRect(R, 0, Offset);
  289.   end;
  290. end;
  291. procedure TVrLevelBar.Paint;
  292. var
  293.   R: TRect;
  294. begin
  295.   CalcPaintParams;
  296.   ClearBitmapCanvas;
  297.   R := ClientRect;
  298.   FBevel.Paint(BitmapCanvas, R);
  299.   case Orientation of
  300.     voVertical: DrawVert;
  301.     voHorizontal: DrawHori;
  302.   end;
  303.   inherited Paint;
  304. end;
  305. procedure TVrLevelBar.CalcPaintParams;
  306. begin
  307.   FTickStep := FTickHeight + FSpacing;
  308.   FViewPort := ClientRect;
  309.   FBevel.GetVisibleArea(FViewPort);
  310.   case Orientation of
  311.     voVertical:
  312.       begin
  313.         FTicks := (HeightOf(FViewPort) + FSpacing) div FTickStep;
  314.         Height := (FViewPort.Top * 2) + (FTicks * FTickStep) - FSpacing;
  315.       end;
  316.     voHorizontal:
  317.       begin
  318.         FTicks := (WidthOf(FViewPort) + FSpacing) div FTickStep;
  319.         Width := (FViewPort.Left * 2) + (FTicks * FTickStep) - FSpacing;
  320.       end;
  321.   end;
  322. end;
  323. procedure TVrLevelBar.SetPalette1(Value: TVrPalette);
  324. begin
  325.   FPalette1.Assign(Value);
  326. end;
  327. procedure TVrLevelBar.SetPalette2(Value: TVrPalette);
  328. begin
  329.   FPalette2.Assign(Value);
  330. end;
  331. procedure TVrLevelBar.SetPalette3(Value: TVrPalette);
  332. begin
  333.   FPalette3.Assign(Value);
  334. end;
  335. procedure TVrLevelBar.SetOrientation(Value: TVrOrientation);
  336. begin
  337.   if FOrientation <> Value then
  338.   begin
  339.     FOrientation := Value;
  340.     if not Loading then
  341.       BoundsRect := Bounds(Left, Top, Height, Width);
  342.     UpdateControlCanvas;
  343.   end;
  344. end;
  345. procedure TVrLevelBar.SetBevel(Value: TVrBevel);
  346. begin
  347.   FBevel.Assign(Value);
  348. end;
  349. procedure TVrLevelBar.SetTickHeight(Value: Integer);
  350. begin
  351.   if (FTickHeight <> Value) and (Value > 0) then
  352.   begin
  353.     FTickHeight := Value;
  354.     UpdateControlCanvas;
  355.   end;
  356. end;
  357. procedure TVrLevelBar.SetSpacing(Value: Integer);
  358. begin
  359.   if FSpacing <> Value then
  360.   begin
  361.     FSpacing := Value;
  362.     UpdateControlCanvas;
  363.   end;
  364. end;
  365. procedure TVrLevelBar.SetMinValue(Value: Integer);
  366. begin
  367.   if (FMinValue <> Value) and (Value < FMaxValue) then
  368.   begin
  369.     FMinValue := Value;
  370.     if FPosition < FMinValue then
  371.       Position := FMinValue else UpdateControlCanvas;
  372.   end;
  373. end;
  374. procedure TVrLevelBar.SetMaxValue(Value: Integer);
  375. begin
  376.   if (FMaxValue <> Value) and (Value > FMinValue) then
  377.   begin
  378.     FMaxValue := Value;
  379.     if FPosition > FMaxValue then
  380.       Position := FMaxValue else UpdateControlCanvas;
  381.   end;
  382. end;
  383. procedure TVrLevelBar.SetPosition(Value: Integer);
  384. begin
  385.   if Value < FMinValue then Value := FMinValue;
  386.   if Value > FMaxValue then Value := FMaxValue;
  387.   if FPosition <> Value then
  388.   begin
  389.     FPosition := Value;
  390.     UpdateControlCanvas;
  391.     Changed;
  392.   end;
  393. end;
  394. procedure TVrLevelBar.SetPercent1(Value: TVrPercentInt);
  395. begin
  396.   if (FPercent1 <> Value) then
  397.   begin
  398.     if not Loading then
  399.       if Value + Percent2 > 100 then Value := 100 - Percent2;
  400.     FPercent1 := Value;
  401.     UpdateControlCanvas;
  402.   end;
  403. end;
  404. procedure TVrLevelBar.SetPercent2(Value: TVrPercentInt);
  405. begin
  406.   if (FPercent2 <> Value) and (Value + Percent1 <= 100) then
  407.   begin
  408.     if not Loading then
  409.       if Value + Percent1 > 100 then Value := 100 - Percent1;
  410.     FPercent2 := Value;
  411.     UpdateControlCanvas;
  412.   end;
  413. end;
  414. procedure TVrLevelBar.SetStyle(Value: TVrProgressStyle);
  415. begin
  416.   if FStyle <> Value then
  417.   begin
  418.     FStyle := Value;
  419.     UpdateControlCanvas;
  420.   end;
  421. end;
  422. end.