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

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrSpectrum;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
  14.   VrTypes, VrClasses, VrControls, VrSysUtils;
  15. type
  16.   TVrSpectrum = class;
  17.   TVrSpectrumBar = class(TVrCollectionItem)
  18.   private
  19.     FPosition: Integer;
  20.     procedure SetPosition(Value: Integer);
  21.   public
  22.     constructor Create(Collection: TVrCollection); override;
  23.     property Position: Integer read FPosition write SetPosition;
  24.   end;
  25.   TVrSpectrumBars = class(TVrCollection)
  26.   private
  27.     FOwner: TVrSpectrum;
  28.     function GetItem(Index: Integer): TVrSpectrumBar;
  29.   protected
  30.     procedure Update(Item: TVrCollectionItem); override;
  31.   public
  32.     constructor Create(AOwner: TVrSpectrum);
  33.     property Items[Index: Integer]: TVrSpectrumBar read GetItem;
  34.   end;
  35.   TVrSpectrum = class(TVrGraphicImageControl)
  36.   private
  37.     FBarWidth: TVrMaxInt;
  38.     FBarSpacing: Integer;
  39.     FPlainColors: Boolean;
  40.     FColumns: Integer;
  41.     FMaxValue: Integer;
  42.     FMinValue: Integer;
  43.     FBevel: TVrBevel;
  44.     FPalette1: TVrPalette;
  45.     FPalette2: TVrPalette;
  46.     FPalette3: TVrPalette;
  47.     FPercent1: TVrPercentInt;
  48.     FPercent2: TVrPercentInt;
  49.     FMarkerColor: TColor;
  50.     FMarkerVisible: Boolean;
  51.     FShowInactive: Boolean;
  52.     FTickHeight: Integer;
  53.     FSpacing: Integer;
  54.     FViewPort: TRect;
  55.     FBarImages: array[0..1] of TBitmap;
  56.     Ticks: Integer;
  57.     Collection: TVrSpectrumBars;
  58.     function GetCount: Integer;
  59.     function GetItem(Index: Integer): TVrSpectrumBar;
  60.     function GetPercentDone(Position: Longint): Longint;
  61.     procedure SetColumns(Value: Integer);
  62.     procedure SetMaxValue(Value: Integer);
  63.     procedure SetMinValue(Value: Integer);
  64.     procedure SetMarkerColor(Value: TColor);
  65.     procedure SetMarkerVisible(Value: Boolean);
  66.     procedure SetTickHeight(Value: Integer);
  67.     procedure SetSpacing(Value: Integer);
  68.     procedure SetPalette1(Value: TVrPalette);
  69.     procedure SetPalette2(Value: TVrPalette);
  70.     procedure SetPalette3(Value: TVrPalette);
  71.     procedure SetPercent1(Value: TVrPercentInt);
  72.     procedure SetPercent2(Value: TVrPercentInt);
  73.     procedure SetBevel(Value: TVrBevel);
  74.     procedure SetBarWidth(Value: TVrMaxInt);
  75.     procedure SetBarSpacing(Value: Integer);
  76.     procedure SetShowInactive(Value: Boolean);
  77.     procedure SetPlainColors(Value: Boolean);
  78.     procedure PaletteModified(Sender: TObject);
  79.     procedure BevelChanged(Sender: TObject);
  80.   protected
  81.     procedure CreateObjects;
  82.     procedure GetItemRect(Index: Integer; var R: TRect);
  83.     procedure UpdateBar(Index: Integer);
  84.     procedure UpdateBars;
  85.     procedure Paint; override;
  86.     procedure CalcPaintParams;
  87.     procedure CreateBarImages;
  88.   public
  89.     constructor Create(AOwner: TComponent); override;
  90.     destructor Destroy; override;
  91.     procedure Reset(Value: Integer);
  92.     property Count: Integer read GetCount;
  93.     property Items[Index: Integer]: TVrSpectrumBar read GetItem;
  94.   published
  95.     property Palette1: TVrPalette read FPalette1 write SetPalette1;
  96.     property Palette2: TVrPalette read FPalette2 write SetPalette2;
  97.     property Palette3: TVrPalette read FPalette3 write SetPalette3;
  98.     property Percent1: TVrPercentInt read FPercent1 write SetPercent1 default 60;
  99.     property Percent2: TVrPercentInt read FPercent2 write SetPercent2 default 25;
  100.     property Bevel: TVrBevel read FBevel write SetBevel;
  101.     property Columns: Integer read FColumns write SetColumns default 24;
  102.     property MaxValue: Integer read FMaxValue write SetMaxValue default 100;
  103.     property MinValue: Integer read FMinValue write SetMinValue default 0;
  104.     property MarkerColor: TColor read FMarkerColor write SetMarkerColor default clWhite;
  105.     property MarkerVisible: Boolean read FMarkerVisible write SetMarkerVisible default True;
  106.     property TickHeight: Integer read FTickHeight write SetTickHeight default 1;
  107.     property Spacing: Integer read FSpacing write SetSpacing default 1;
  108.     property BarWidth: TVrMaxInt read FBarWidth write SetBarWidth default 8;
  109.     property BarSpacing: Integer read FBarSpacing write SetBarSpacing default 1;
  110.     property ShowInactive: Boolean read FShowInactive write SetShowInactive default True;
  111.     property PlainColors: Boolean read FPlainColors write SetPlainColors default false;
  112.     property Color default clBlack;
  113. {$IFDEF VER110}
  114.     property Anchors;
  115.     property Constraints;
  116. {$ENDIF}
  117.     property Cursor;
  118.     property DragMode;
  119. {$IFDEF VER110}
  120.     property DragKind;
  121. {$ENDIF}
  122.     property DragCursor;
  123.     property ParentColor default false;
  124.     property ParentShowHint;
  125.     property PopupMenu;
  126.     property ShowHint;
  127.     property Visible;
  128.     property OnClick;
  129. {$IFDEF VER130}
  130.     property OnContextPopup;
  131. {$ENDIF}
  132.     property OnDblClick;
  133.     property OnDragOver;
  134.     property OnDragDrop;
  135. {$IFDEF VER110}
  136.     property OnEndDock;
  137. {$ENDIF}
  138.     property OnEndDrag;
  139.     property OnMouseMove;
  140.     property OnMouseDown;
  141.     property OnMouseUp;
  142. {$IFDEF VER110}
  143.     property OnStartDock;
  144. {$ENDIF}
  145.     property OnStartDrag;
  146.   end;
  147. implementation
  148. procedure DrawBarImage(Canvas: TCanvas; const Rect: TRect; Color1,
  149.   Color2, Color3: TColor; Point1, Point2: Integer; PlainColors: Boolean);
  150. var
  151.   P: TPoint;
  152.   I: Integer;
  153.   ColorRect: TRect;
  154.   R, G, B: Byte;
  155.   R1, G1, B1, R2, G2, B2, R3, G3, B3: Byte;
  156. begin
  157.   P.X := WidthOf(Rect);
  158.   P.Y := HeightOf(Rect);
  159.   if PlainColors then
  160.   begin
  161.     I := P.Y - Point1 - Point2;
  162.     ColorRect := Bounds(Rect.Left, Rect.Top, P.X, I);
  163.     Canvas.Brush.Color := Color1;
  164.     Canvas.FillRect(ColorRect);
  165.     ColorRect := Bounds(Rect.Left, Rect.Top + I, P.X, Point2);
  166.     Canvas.Brush.Color := Color2;
  167.     Canvas.FillRect(ColorRect);
  168.     ColorRect := Bounds(Rect.Left, Rect.Top + I + Point2, P.X, Point1);
  169.     Canvas.Brush.Color := Color3;
  170.     Canvas.FillRect(ColorRect);
  171.     Exit;
  172.   end;
  173.   Point1 := MaxIntVal(1, Point1 + (Point2 div 2));
  174.   Point2 := MaxIntVal(1, P.Y - Point1);
  175.   GetRGB(Color1,  R1, G1, B1);
  176.   GetRGB(Color2,  R2, G2, B2);
  177.   GetRGB(Color3,  R3, G3, B3);
  178.   ColorRect := Bounds(Rect.Left, Rect.Top, P.X, 1);
  179.   I := 0;
  180.   while I <= Point2 do
  181.   begin
  182.     R := R1 + I * (R2 - R1) div Point2;
  183.     G := G1 + I * (G2 - G1) div Point2;
  184.     B := B1 + I * (B2 - B1) div Point2;
  185.     Canvas.Brush.Color := RGB(R, G, B);
  186.     FillRect(Canvas.Handle, ColorRect, Canvas.Brush.Handle);
  187.     OffsetRect(ColorRect, 0, 1);
  188.     Inc(I, 1);
  189.   end;
  190.   I := 0;
  191.   while I <= Point1 do
  192.   begin
  193.     R := R2 + I * (R3 - R2) div Point1;
  194.     G := G2 + I * (G3 - G2) div Point1;
  195.     B := B2 + I * (B3 - B2) div Point1;
  196.     Canvas.Brush.Color := RGB(R, G, B);
  197.     FillRect(Canvas.Handle, ColorRect, Canvas.Brush.Handle);
  198.     OffsetRect(ColorRect, 0, 1);
  199.     Inc(I, 1);
  200.   end;
  201. end;
  202. { TVrSpectrumBar }
  203. constructor TVrSpectrumBar.Create(Collection: TVrCollection);
  204. begin
  205.   FPosition := 0;
  206.   inherited Create(Collection);
  207. end;
  208. procedure TVrSpectrumBar.SetPosition(Value: Integer);
  209. begin
  210.   if FPosition <> Value then
  211.   begin
  212.     FPosition := Value;
  213.     Changed(false);
  214.   end;
  215. end;
  216. { TVrSpectrumBars }
  217. constructor TVrSpectrumBars.Create(AOwner: TVrSpectrum);
  218. begin
  219.   inherited Create;
  220.   FOwner := AOwner;
  221. end;
  222. function TVrSpectrumBars.GetItem(Index: Integer): TVrSpectrumBar;
  223. begin
  224.   Result := TVrSpectrumBar(inherited Items[Index]);
  225. end;
  226. procedure TVrSpectrumBars.Update(Item: TVrCollectionItem);
  227. begin
  228.   if Item <> nil then
  229.     FOwner.UpdateBar(Item.Index) else
  230.     FOwner.UpdateBars;
  231. end;
  232. {TVrSpectrum}
  233. constructor TVrSpectrum.Create(AOwner: TComponent);
  234. begin
  235.   inherited Create(AOwner);
  236.   ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  237.   Width := 217;
  238.   Height := 117;
  239.   ParentColor := false;
  240.   Color := clBlack;
  241.   FColumns := 24;
  242.   FMinValue := 0;
  243.   FMaxValue := 100;
  244.   FMarkerColor := clWhite;
  245.   FMarkerVisible := True;
  246.   FTickHeight := 1;
  247.   FSpacing := 1;
  248.   FPercent1 := 60;
  249.   FPercent2 := 25;
  250.   FBarWidth := 8;
  251.   FBarSpacing := 1;
  252.   FShowInactive := True;
  253.   FPlainColors := false;
  254.   FPalette1 := TVrPalette.Create;
  255.   FPalette1.OnChange := PaletteModified;
  256.   FPalette2 := TVrPalette.Create;
  257.   with FPalette2 do
  258.   begin
  259.     Low := clOlive;
  260.     High := clYellow;
  261.     OnChange := PaletteModified;
  262.   end;
  263.   FPalette3 := TVrPalette.Create;
  264.   with FPalette3 do
  265.   begin
  266.     Low := clMaroon;
  267.     High := clRed;
  268.     OnChange := PaletteModified;
  269.   end;
  270.   FBevel := TVrBevel.Create;
  271.   with FBevel do
  272.   begin
  273.     InnerStyle := bsLowered;
  274.     InnerWidth := 2;
  275.     InnerSpace := 1;
  276.     InnerColor := clBlack;
  277.     OnChange := BevelChanged;
  278.   end;
  279.   AllocateBitmaps(FBarImages);
  280.   Collection := TVrSpectrumBars.Create(Self);
  281.   CreateObjects;
  282. end;
  283. destructor TVrSpectrum.Destroy;
  284. begin
  285.   DeallocateBitmaps(FBarImages);
  286.   Collection.Free;
  287.   FBevel.Free;
  288.   FPalette1.Free;
  289.   FPalette2.Free;
  290.   FPalette3.Free;
  291.   inherited Destroy;
  292. end;
  293. procedure TVrSpectrum.CreateObjects;
  294. var
  295.   I: Integer;
  296. begin
  297.   Collection.Clear;
  298.   for I := 0 to Pred(FColumns) do
  299.     TVrSpectrumBar.Create(Collection);
  300. end;
  301. procedure TVrSpectrum.CreateBarImages;
  302. var
  303.   I, Y, P1, P2, Point: Integer;
  304. begin
  305.   for I := 0 to 1 do
  306.   begin
  307.     FBarImages[I].Width := BarWidth;
  308.     FBarImages[I].Height := HeightOf(FViewPort);
  309.   end;
  310.   P1 := Percent1;
  311.   P2 := Percent2;
  312.   Y := HeightOf(FViewPort);
  313.   if PlainColors then
  314.   begin
  315.     Point := SolveForX(P1, Ticks);
  316.     P1 := (Point * (TickHeight + Spacing));
  317.     Point := SolveForX(P2, Ticks);
  318.     P2 := (Point * (TickHeight + Spacing));
  319.   end else
  320.   begin
  321.     P1 := SolveForX(P1, Y);
  322.     P2 := SolveForX(P2, Y);
  323.   end;
  324.   DrawBarImage(FBarImages[0].Canvas, BitmapRect(FBarImages[0]),
  325.     FPalette3[0], FPalette2[0], FPalette1[0], P1, P2, PlainColors);
  326.   DrawBarImage(FBarImages[1].Canvas, BitmapRect(FBarImages[1]),
  327.     FPalette3[1], FPalette2[1], FPalette1[1], P1, P2, PlainColors);
  328. end;
  329. procedure TVrSpectrum.PaletteModified(Sender: TObject);
  330. begin
  331.   UpdateControlCanvas;
  332. end;
  333. procedure TVrSpectrum.BevelChanged(Sender: TObject);
  334. var
  335.   R: TRect;
  336. begin
  337.   if not Loading then
  338.   begin
  339.     R := ClientRect;
  340.     FBevel.GetVisibleArea(R);
  341.     InflateRect(FViewPort, R.Left, R.Top);
  342.     BoundsRect := Bounds(Left, Top, WidthOf(FViewPort),
  343.       HeightOf(FViewPort));
  344.   end;
  345.   UpdateControlCanvas;
  346. end;
  347. function TVrSpectrum.GetCount: Integer;
  348. begin
  349.   Result := Collection.Count;
  350. end;
  351. function TVrSpectrum.GetItem(Index: Integer): TVrSpectrumBar;
  352. begin
  353.   Result := Collection.Items[Index];
  354. end;
  355. procedure TVrSpectrum.SetSpacing(Value: Integer);
  356. begin
  357.   if FSpacing <> Value then
  358.   begin
  359.     FSpacing := Value;
  360.     UpdateControlCanvas;
  361.   end;
  362. end;
  363. procedure TVrSpectrum.SetColumns(Value: Integer);
  364. begin
  365.   if (FColumns <> Value) and (Value > 0) then
  366.   begin
  367.     FColumns := Value;
  368.     CreateObjects;
  369.     UpdateControlCanvas;
  370.   end;
  371. end;
  372. procedure TVrSpectrum.SetMaxValue(Value: Integer);
  373. var
  374.   I: Integer;
  375. begin
  376.   if (FMaxValue <> Value) and (Value > FMinValue) then
  377.   begin
  378.     FMaxValue := Value;
  379.     for I := 0 to Pred(Count) do
  380.       with Items[I] do
  381.         if (Position > FMaxValue) then Position := FMaxValue;
  382.   end;
  383. end;
  384. procedure TVrSpectrum.SetMinValue(Value: Integer);
  385. var
  386.   I: Integer;
  387. begin
  388.   if (FMinValue <> Value) and (Value < FMaxValue) then
  389.   begin
  390.     FMinValue := Value;
  391.     for I := 0 to Pred(Count) do
  392.       with Items[I] do
  393.         if (Position < FMinValue) then Position := FMinValue;
  394.   end;
  395. end;
  396. procedure TVrSpectrum.SetMarkerColor(Value: TColor);
  397. begin
  398.   if FMarkerColor <> Value then
  399.   begin
  400.     FMarkerColor := Value;
  401.     UpdateControlCanvas;
  402.   end;
  403. end;
  404. procedure TVrSpectrum.SetMarkerVisible(Value: Boolean);
  405. begin
  406.   if FMarkerVisible <> Value then
  407.   begin
  408.     FMarkerVisible := Value;
  409.     UpdateControlCanvas;
  410.   end;
  411. end;
  412. procedure TVrSpectrum.SetTickHeight(Value: Integer);
  413. begin
  414.   if (FTickHeight <> Value) and (Value > 0) then
  415.   begin
  416.     FTickHeight := Value;
  417.     UpdateControlCanvas;
  418.   end;
  419. end;
  420. procedure TVrSpectrum.SetPalette1(Value: TVrPalette);
  421. begin
  422.   FPalette1.Assign(Value);
  423. end;
  424. procedure TVrSpectrum.SetPalette2(Value: TVrPalette);
  425. begin
  426.   FPalette2.Assign(Value);
  427. end;
  428. procedure TVrSpectrum.SetPalette3(Value: TVrPalette);
  429. begin
  430.   FPalette3.Assign(Value);
  431. end;
  432. procedure TVrSpectrum.SetBevel(Value: TVrBevel);
  433. begin
  434.   FBevel.Assign(Value);
  435. end;
  436. procedure TVrSpectrum.SetPercent1(Value: TVrPercentInt);
  437. begin
  438.   if (FPercent1 <> Value) then
  439.   begin
  440.     if not Loading then
  441.       if Value + Percent2 > 100 then Value := 100 - Percent2;
  442.     FPercent1 := Value;
  443.     UpdateControlCanvas;
  444.   end;
  445. end;
  446. procedure TVrSpectrum.SetPercent2(Value: TVrPercentInt);
  447. begin
  448.   if (FPercent2 <> Value) then
  449.   begin
  450.     if not Loading then
  451.       if Value + Percent1 > 100 then Value := 100 - Percent1;
  452.     FPercent2 := Value;
  453.     UpdateControlCanvas;
  454.   end;
  455. end;
  456. procedure TVrSpectrum.SetShowInactive(Value: Boolean);
  457. begin
  458.   if FShowInactive <> Value then
  459.   begin
  460.     FShowInactive := Value;
  461.     UpdateControlCanvas;
  462.   end;
  463. end;
  464. procedure TVrSpectrum.SetBarWidth(Value: TVrMaxInt);
  465. begin
  466.   if FBarWidth <> Value then
  467.   begin
  468.     FBarWidth := Value;
  469.     UpdateControlCanvas;
  470.   end;
  471. end;
  472. procedure TVrSpectrum.SetBarSpacing(Value: Integer);
  473. begin
  474.   if FBarSpacing <> Value then
  475.   begin
  476.     FBarSpacing := Value;
  477.     UpdateControlCanvas;
  478.   end;
  479. end;
  480. procedure TVrSpectrum.SetPlainColors(Value: Boolean);
  481. begin
  482.   if FPlainColors <> Value then
  483.   begin
  484.     FPlainColors := Value;
  485.     UpdateControlCanvas;
  486.   end;
  487. end;
  488. function TVrSpectrum.GetPercentDone(Position: Longint): Longint;
  489. begin
  490.   Result := SolveForY(Position - FMinValue, FMaxValue - FMinValue);
  491. end;
  492. procedure TVrSpectrum.UpdateBar(Index: Integer);
  493. var
  494.   R, PaintRect, ImageRect: TRect;
  495.   I: Integer;
  496.   TicksOn, TicksOff: Integer;
  497.   Item: TVrSpectrumBar;
  498. begin
  499.   Item := Collection.Items[Index];
  500.   GetItemRect(Index, R);
  501.   TicksOn := SolveForX(GetPercentDone(Item.Position), Ticks);
  502.   TicksOff := Ticks - TicksOn;
  503.   PaintRect := Bounds(R.Left, R.Top, R.Right - R.Left, FTickHeight);
  504.   with DestCanvas do
  505.   begin
  506.     for I := 1 to TicksOff do
  507.     begin
  508.       if FShowInactive then
  509.       begin
  510.         ImageRect := Bounds(0, PaintRect.Top - FViewPort.Top,
  511.           BarWidth, TickHeight);
  512.         CopyRect(PaintRect, FBarImages[0].Canvas, ImageRect);
  513.       end else
  514.       begin
  515.         Brush.Color := Self.Color;
  516.         FillRect(PaintRect);
  517.       end;
  518.       OffsetRect(PaintRect, 0, FTickHeight + FSpacing);
  519.     end;
  520.     for I := 1 to TicksOn do
  521.     begin
  522.       if (MarkerVisible) and (I = 1) then
  523.       begin
  524.         Brush.Color := FMarkerColor;
  525.         FillRect(PaintRect);
  526.       end else
  527.       begin
  528.         ImageRect := Bounds(0, PaintRect.Top - FViewPort.Top,
  529.           BarWidth, TickHeight);
  530.         CopyRect(PaintRect, FBarImages[1].Canvas, ImageRect);
  531.       end;
  532.       OffsetRect(PaintRect, 0, FTickHeight + FSpacing);
  533.     end;
  534.   end;
  535. end;
  536. procedure TVrSpectrum.UpdateBars;
  537. var
  538.   I: Integer;
  539. begin
  540.   for I := 0 to Collection.Count - 1 do
  541.     UpdateBar(I);
  542. end;
  543. procedure TVrSpectrum.Paint;
  544. var
  545.   R: TRect;
  546. begin
  547.   CalcPaintParams;
  548.   ClearBitmapCanvas;
  549.   DestCanvas := BitmapCanvas;
  550.   try
  551.     R := ClientRect;
  552.     FBevel.Paint(BitmapCanvas, R);
  553.     UpdateBars;
  554.     inherited Paint;
  555.   finally
  556.     DestCanvas := Self.Canvas;
  557.   end;
  558. end;
  559. procedure TVrSpectrum.CalcPaintParams;
  560. var
  561.   R: TRect;
  562.   Step: Integer;
  563.   NewWidth, NewHeight: Integer;
  564. begin
  565.   R := ClientRect;
  566.   FBevel.GetVisibleArea(R);
  567.   FViewPort := R;
  568.   Step := FTickHeight + FSpacing;
  569.   Ticks := (HeightOf(R) + FSpacing) div Step;
  570.   CreateBarImages;
  571.   NewWidth := (R.Left * 2) +
  572.     ((FBarWidth + FBarSpacing) * FColumns) - FBarSpacing;
  573.   NewHeight := (R.Top * 2) + (Ticks * Step) - FSpacing;
  574.   if (Width <> NewWidth) or (Height <> NewHeight) then
  575.     BoundsRect := Bounds(Left, Top, NewWidth, NewHeight);
  576. end;
  577. procedure TVrSpectrum.GetItemRect(Index: Integer; var R: TRect);
  578. var
  579.   X: Integer;
  580. begin
  581.   X := (BarWidth + BarSpacing) * Index;
  582.   R := Bounds(FViewPort.Left + X, FViewPort.Top,
  583.     BarWidth, HeightOf(FViewPort));
  584. end;
  585. procedure TVrSpectrum.Reset(Value: Integer);
  586. var
  587.   I: Integer;
  588. begin
  589.   if Value > FMaxValue then Value := FMaxValue
  590.   else if Value < FMinValue then Value := FMinValue;
  591.   for I := 0 to Pred(Count) do
  592.     Collection.Items[I].Position := Value;
  593. end;
  594. end.