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

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrScale;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   StdCtrls, VrTypes, VrClasses, VrControls, VrSysUtils;
  15. type
  16.   TVrScale = class(TVrGraphicImageControl)
  17.   private
  18.     FMin: Integer;
  19.     FMax: Integer;
  20.     FTicks: Integer;
  21.     FOrientation: TVrOrientation;
  22.     FDigits: Integer;
  23.     FLeadingZero: Boolean;
  24.     FAlignment: TAlignment;
  25.     FLayOut: TTextLayout;
  26.     FScaleColor: TColor;
  27.     FPeakLevel: Integer;
  28.     FPeakColor: TColor;
  29.     FShowSign: Boolean;
  30.     FTickMarks: TVrTickMarks;
  31.     FScaleOffset: Integer;
  32.     FItemSize: Integer;
  33.     FIncrement: Integer;
  34.     procedure SetMin(Value: Integer);
  35.     procedure SetMax(Value: Integer);
  36.     procedure SetTicks(Value: Integer);
  37.     procedure SetOrientation(Value: TVrOrientation);
  38.     procedure SetLeadingZero(Value: Boolean);
  39.     procedure SetDigits(Value: Integer);
  40.     procedure SetAlignment(Value: TAlignment);
  41.     procedure SetScaleColor(Value: TColor);
  42.     procedure SetScaleOffset(Value: Integer);
  43.     procedure SetPeakLevel(Value: Integer);
  44.     procedure SetPeakColor(Value: TColor);
  45.     procedure SetLayout(Value: TTextLayout);
  46.     procedure SetShowSign(Value: Boolean);
  47.     procedure SetTickMarks(Value: TVrTickMarks);
  48.     procedure ShowText(const S: string; R: TRect);
  49.     procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  50.   protected
  51.     procedure DrawHori;
  52.     procedure DrawVert;
  53.     procedure Paint; override;
  54.     procedure CalcPaintParams;
  55.     function FormatValue(Value: Integer): string;
  56.   public
  57.     constructor Create(AOwner: TComponent); override;
  58.   published
  59.     property Max: Integer read FMax write SetMax default 100;
  60.     property Min: Integer read FMin write SetMin Default 0;
  61.     property Ticks: Integer read FTicks write SetTicks default 5;
  62.     property Orientation: TVrOrientation read FOrientation write SetOrientation default voHorizontal;
  63.     property LeadingZero: Boolean read FLeadingZero write SetLeadingZero default false;
  64.     property Digits: Integer read FDigits write SetDigits default 3;
  65.     property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;
  66.     property Layout: TTextLayout read FLayout write SetLayout default tlCenter;
  67.     property ScaleColor: TColor read FScaleColor write SetScaleColor default clGreen;
  68.     property PeakLevel: Integer read FPeakLevel write SetPeakLevel default 80;
  69.     property PeakColor: TColor read FPeakColor write SetPeakColor default clLime;
  70.     property ShowSign: Boolean read FShowSign write SetShowSign default True;
  71.     property TickMarks: TVrTickMarks read FTickMarks write SetTickMarks default tmNone;
  72.     property ScaleOffset: Integer read FScaleOffset write SetScaleOffset default 4;
  73.     property Transparent default false;
  74.     property Color default clBlack;
  75.     property ParentColor default false;
  76.     property Align;
  77. {$IFDEF VER110}
  78.     property Anchors;
  79.     property Constraints;
  80. {$ENDIF}
  81.     property DragCursor;
  82. {$IFDEF VER110}
  83.     property DragKind;
  84. {$ENDIF}
  85.     property DragMode;
  86.     property Font;
  87.     property ParentFont;
  88.     property ParentShowHint;
  89.     property PopupMenu;
  90.     property ShowHint;
  91.     property Visible;
  92.     property OnClick;
  93. {$IFDEF VER130}
  94.     property OnContextPopup;
  95. {$ENDIF}    
  96.     property OnDblClick;
  97.     property OnDragDrop;
  98.     property OnDragOver;
  99. {$IFDEF VER110}
  100.     property OnEndDock;
  101. {$ENDIF}
  102.     property OnEndDrag;
  103.     property OnMouseDown;
  104.     property OnMouseMove;
  105.     property OnMouseUp;
  106. {$IFDEF VER110}
  107.     property OnStartDock;
  108. {$ENDIF}
  109.     property OnStartDrag;
  110.   end;
  111. implementation
  112. const
  113.   AlignValue: array[TAlignment] of Integer =
  114.     (DT_LEFT, DT_RIGHT, DT_CENTER);
  115.   LayoutValue: array[TTextLayout] of Integer =
  116.     (DT_TOP, DT_VCENTER, DT_BOTTOM);
  117. constructor TVrScale.Create(AOwner: TComponent);
  118. begin
  119.   inherited Create(AOwner);
  120.   ControlStyle := ControlStyle + [csOpaque, csReplicatable];
  121.   Width := 215;
  122.   Height := 11;
  123.   Color := clBlack;
  124.   ParentColor := false;
  125.   Font.Name := 'Arial';
  126.   Font.Size := 7;
  127.   Font.Color := clGreen;
  128.   FMin := 0;
  129.   FMax := 100;
  130.   FDigits := 3;
  131.   FTicks := 5;
  132.   FTickMarks := tmNone;
  133.   FOrientation := voHorizontal;
  134.   FLeadingZero := false;
  135.   FAlignment := taCenter;
  136.   FLayout := tlCenter;
  137.   FScaleColor := clGreen;
  138.   FScaleOffset := 4;
  139.   FPeakLevel := 80;
  140.   FPeakColor := clLime;
  141.   FShowSign := True;
  142. end;
  143. procedure TVrScale.SetMin(Value: Integer);
  144. begin
  145.   if FMin <> Value then
  146.   begin
  147.     FMin := Value;
  148.     UpdateControlCanvas;
  149.   end;
  150. end;
  151. procedure TVrScale.SetMax(Value: Integer);
  152. begin
  153.   if FMax <> Value then
  154.   begin
  155.     FMax := Value;
  156.     UpdateControlCanvas;
  157.   end;
  158. end;
  159. procedure TVrScale.SetTicks(Value: Integer);
  160. begin
  161.   if FTicks <> Value then
  162.   begin
  163.     FTicks := Value;
  164.     UpdateControlCanvas;
  165.   end;
  166. end;
  167. procedure TVrScale.SetOrientation(Value: TVrOrientation);
  168. begin
  169.   if FOrientation <> Value then
  170.   begin
  171.     FOrientation := Value;
  172.     if not Loading then
  173.       BoundsRect := Bounds(Top, Left, Height, Width);
  174.     UpdateControlCanvas;
  175.   end;
  176. end;
  177. procedure TVrScale.SetLeadingZero(Value: Boolean);
  178. begin
  179.   if FLeadingZero <> Value then
  180.   begin
  181.     FLeadingZero := Value;
  182.     UpdateControlCanvas;
  183.   end;
  184. end;
  185. procedure TVrScale.SetDigits(Value: Integer);
  186. begin
  187.   if FDigits <> Value then
  188.   begin
  189.     FDigits := Value;
  190.     UpdateControlCanvas;
  191.   end;
  192. end;
  193. procedure TVrScale.SetAlignment(Value: TAlignment);
  194. begin
  195.   if FAlignment <> Value then
  196.   begin
  197.     FAlignment := Value;
  198.     UpdateControlCanvas;
  199.   end;
  200. end;
  201. procedure TVrScale.SetLayout(Value: TTextLayout);
  202. begin
  203.   if FLayout <> Value then
  204.   begin
  205.     FLayout := Value;
  206.     UpdateControlCanvas;
  207.   end;
  208. end;
  209. procedure TVrScale.SetScaleColor(Value: TColor);
  210. begin
  211.   if FScaleColor <> Value then
  212.   begin
  213.     FScaleColor := Value;
  214.     UpdateControlCanvas;
  215.   end;
  216. end;
  217. procedure TVrScale.SetScaleOffset(Value: Integer);
  218. begin
  219.   if FScaleOffset <> Value then
  220.   begin
  221.     FScaleOffset := Value;
  222.     UpdateControlCanvas;
  223.   end;
  224. end;
  225. procedure TVrScale.SetPeakLevel(Value: Integer);
  226. begin
  227.   if FPeakLevel <> Value then
  228.   begin
  229.     FPeakLevel := Value;
  230.     UpdateControlCanvas;
  231.   end;
  232. end;
  233. procedure TVrScale.SetPeakColor(Value: TColor);
  234. begin
  235.   if FPeakColor <> Value then
  236.   begin
  237.     FPeakColor := Value;
  238.     UpdateControlCanvas;
  239.   end;
  240. end;
  241. procedure TVrScale.SetShowSign(Value: Boolean);
  242. begin
  243.   if FShowSign <> Value then
  244.   begin
  245.     FShowSign := Value;
  246.     UpdateControlCanvas;
  247.   end;
  248. end;
  249. procedure TVrScale.SetTickMarks(Value: TVrTickMarks);
  250. begin
  251.   if FTickMarks <> Value then
  252.   begin
  253.     FTickMarks := Value;
  254.     UpdateControlCanvas;
  255.   end;
  256. end;
  257. function TVrScale.FormatValue(Value: Integer): string;
  258. begin
  259.   if FLeadingZero then
  260.     Result := Format('%0.' + IntToStr(FDigits) + 'd', [Value])
  261.   else Result := Format('%d', [Value]);
  262.   if FShowSign then if Value > 0 then Result := '+' + Result;
  263. end;
  264. procedure TVrScale.ShowText(const S: string; R: TRect);
  265. begin
  266.   DrawText(BitmapCanvas.Handle, PChar(S), -1, R,
  267.     DT_NOCLIP or DT_SINGLELINE or
  268.     LayoutValue[FLayout] or AlignValue[FAlignment]);
  269. end;
  270. procedure TVrScale.DrawHori;
  271. var
  272.   I, X, Level: Integer;
  273.   R: TRect;
  274.   S: string;
  275. begin
  276.   with BitmapCanvas do
  277.   begin
  278.     if Transparent then Brush.Style := bsClear
  279.     else Brush.Style := bsSolid;
  280.     Level := FMin;
  281.     R := Bounds(0, 0, FItemSize, ClientHeight);
  282.     for I := 0 to FTicks do
  283.     begin
  284.       if Level >= FPeakLevel then
  285.         Font.Color := FPeakColor else
  286.         Font.Color := Self.Font.Color;
  287.       S := FormatValue(Level);
  288.       ShowText(S, R);
  289.       Inc(Level, FIncrement);
  290.       OffsetRect(R, FItemSize, 0);
  291.     end;
  292.     if FTickMarks <> tmNone then
  293.     begin
  294.       Pen.Width := 1;
  295.       Pen.Color := FScaleColor;
  296.       R := Bounds(0, 0, FItemSize, ClientHeight);
  297.       X := (R.Right - R.Left) div 2;
  298.       for I := 0 to FTicks do
  299.       begin
  300.         if FTickMarks in [tmBoth, tmTopLeft] then
  301.         begin
  302.           MoveTo(R.Left + X, ScaleOffset);
  303.           LineTo(R.Left + X, ScaleOffset + 4);
  304.         end;
  305.         if FTickMarks in [tmBoth, tmBottomRight] then
  306.         begin
  307.           MoveTo(R.Left + X, ClientHeight - ScaleOffset - 4);
  308.           LineTo(R.Left + X, ClientHeight - ScaleOffset);
  309.         end;
  310.         OffsetRect(R, FItemSize, 0);
  311.       end;
  312.     end;
  313.   end;
  314. end;
  315. procedure TVrScale.DrawVert;
  316. var
  317.   I, Y, Level: Integer;
  318.   R: TRect;
  319.   S: string;
  320. begin
  321.   with BitmapCanvas do
  322.   begin
  323.     if Transparent then Brush.Style := bsClear
  324.     else Brush.Style := bsSolid;
  325.     Level := FMin;
  326.     R := Bounds(0, ClientHeight - FItemSize, ClientWidth, FItemSize);
  327.     for I := 0 to FTicks do
  328.     begin
  329.       if Level >= FPeakLevel then
  330.         Font.Color := FPeakColor else
  331.         Font.Color := Self.Font.Color;
  332.       S := FormatValue(Level);
  333.       ShowText(S, R);
  334.       Inc(Level, FIncrement);
  335.       OffsetRect(R, 0, -FItemSize);
  336.     end;
  337.     if FTickMarks <> tmNone then
  338.     begin
  339.       Pen.Width := 1;
  340.       Pen.Color := FScaleColor;
  341.       R := Bounds(0, ClientHeight - FItemSize, ClientWidth, FItemSize);
  342.       Y := (R.Bottom - R.Top) div 2;
  343.       for I := 0 to FTicks do
  344.       begin
  345.         if FTickMarks in [tmBoth, tmTopLeft] then
  346.         begin
  347.           MoveTo(ScaleOffset, R.Top + Y);
  348.           LineTo(ScaleOffset + 4, R.Top + Y);
  349.         end;
  350.         if FTickMarks in [tmBoth, tmBottomRight] then
  351.         begin
  352.           MoveTo(ClientWidth - ScaleOffset - 4, R.Top + Y);
  353.           LineTo(ClientWidth - ScaleOffset, R.Top + Y);
  354.         end;
  355.         OffsetRect(R, 0, -FItemSize);
  356.       end;
  357.     end;
  358.   end;
  359. end;
  360. procedure TVrScale.Paint;
  361. begin
  362.   CalcPaintParams;
  363.   ClearBitmapCanvas;
  364.   if FOrientation = voHorizontal then
  365.     DrawHori else DrawVert;
  366.   inherited Paint;
  367. end;
  368. procedure TVrScale.CalcPaintParams;
  369. begin
  370.   FIncrement := (FMax - FMin) div FTicks;
  371.   case Orientation of
  372.     voVertical: FItemSize := ClientHeight div Succ(FTicks);
  373.     voHorizontal: FItemSize := ClientWidth div Succ(FTicks);
  374.   end;
  375. end;
  376. procedure TVrScale.CMFontChanged(var Message: TMessage);
  377. begin
  378.   BitmapCanvas.Font.Assign(Self.Font);
  379.   inherited;
  380. end;
  381. end.