MMGauge.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:16k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 15.02.98 - 15:32:59 $                                        =}
  24. {========================================================================}
  25. unit MMGauge;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     Classes,
  36.     Controls,
  37.     Graphics,
  38.     Menus,
  39.     MMObj;
  40. type
  41.     TMMGaugeKind = (gkText,gkHorizontalBar,gkVerticalBar,gkPie,gkNeedle);
  42. const
  43.     {$IFDEF CBUILDER3} {$EXTERNALSYM defWidth } {$ENDIF}
  44.     defWidth     = 150;
  45.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHeight } {$ENDIF}
  46.     defHeight    = 18;
  47.     {$IFDEF CBUILDER3} {$EXTERNALSYM defKind } {$ENDIF}
  48.     defKind      = gkHorizontalBar;
  49.     {$IFDEF CBUILDER3} {$EXTERNALSYM defShowText } {$ENDIF}
  50.     defShowText  = True;
  51.     {$IFDEF CBUILDER3} {$EXTERNALSYM defForeColor } {$ENDIF}
  52.     defForeColor = clActiveCaption;
  53.     {$IFDEF CBUILDER3} {$EXTERNALSYM defBackColor } {$ENDIF}
  54.     defBackColor = clWhite;
  55.     {$IFDEF CBUILDER3} {$EXTERNALSYM defMinValue } {$ENDIF}
  56.     defMinValue  = 0;
  57.     {$IFDEF CBUILDER3} {$EXTERNALSYM defMaxValue } {$ENDIF}
  58.     defMaxValue  = 100;
  59.     {$IFDEF CBUILDER3} {$EXTERNALSYM defProgress } {$ENDIF}
  60.     defProgress  = 0;
  61.     {$IFDEF CBUILDER3} {$EXTERNALSYM defBWText } {$ENDIF}
  62.     defBWText    = False;
  63. type
  64.     {-- TMMCustomGauge --------------------------------------------------}
  65.     TMMCustomGauge  = class(TMMGraphicControl)
  66.     private
  67.         FMinValue   : Longint;
  68.         FMaxValue   : Longint;
  69.         FCurValue   : Longint;
  70.         FKind       : TMMGaugeKind;
  71.         FShowText   : Boolean;
  72.         FForeColor  : TColor;
  73.         FBackColor  : TColor;
  74.         FBWText     : Boolean;
  75.         FCaption    : string;
  76.         procedure   SetGaugeKind(Value: TMMGaugeKind);
  77.         procedure   SetShowText(Value: Boolean);
  78.         procedure   SetForeColor(Value: TColor);
  79.         procedure   SetBackColor(Value: TColor);
  80.         procedure   SetMinValue(Value: Longint);
  81.         procedure   SetMaxValue(Value: Longint);
  82.         procedure   SetProgress(Value: Longint);
  83.         procedure   SetCaption(const Value: string);
  84.         procedure   SetBWText(Value: Boolean);
  85.         function    GetPercentDone: LongInt;
  86.     protected
  87.         procedure   Paint; override;
  88.         procedure   PaintImage(Canvas: TCanvas; R: TRect); virtual;
  89.         procedure   PaintText(Canvas: TCanvas; R: TRect); virtual;
  90.         procedure   PaintAsBar(Canvas: TCanvas; R: TRect; Horz: Boolean); virtual;
  91.         procedure   PaintAsPie(Canvas: TCanvas; R: TRect); virtual;
  92.         procedure   PaintAsNeedle(Canvas: TCanvas; R: TRect); virtual;
  93.         procedure   PaintAsNothing(Canvas: TCanvas; R: TRect); virtual;
  94.     public
  95.         constructor Create(AOwner: TComponent); override;
  96.         procedure   AddProgress(Value: Longint);
  97.         property    PercentDone: Longint read GetPercentDone;
  98.     protected
  99.         property    Width default defWidth;
  100.         property    Height default defHeight;
  101.         property    Kind: TMMGaugeKind read FKind write SetGaugeKind default defKind;
  102.         property    ShowText: Boolean read FShowText write SetShowText default defShowText;
  103.         property    ForeColor: TColor read FForeColor write SetForeColor default defForeColor;
  104.         property    BackColor: TColor read FBackColor write SetBackColor default defBackColor;
  105.         property    MinValue: Longint read FMinValue write SetMinValue default defMinValue;
  106.         property    MaxValue: Longint read FMaxValue write SetMaxValue default defMaxValue;
  107.         property    Progress: Longint read FCurValue write SetProgress default defProgress;
  108.         property    Caption: string read FCaption write SetCaption;
  109.         property    BWText: Boolean read FBWText write SetBWText default defBWText;
  110.     end;
  111.     {-- TMMGauge --------------------------------------------------------}
  112.     TMMGauge        = class(TMMCustomGauge)
  113.     published
  114.         property    Kind;
  115.         property    ShowText;
  116.         property    ForeColor;
  117.         property    BackColor;
  118.         property    MinValue;
  119.         property    MaxValue;
  120.         property    Progress;
  121.         property    Caption;
  122.         property    BWText;
  123.         property    Align;
  124.         property    Enabled;
  125.         property    Font;
  126.         property    Bevel;
  127.         property    ParentFont;
  128.         property    ParentShowHint;
  129.         property    PopupMenu;
  130.         property    ShowHint;
  131.         property    Visible;
  132.     end;
  133. implementation
  134. uses
  135.     SysUtils,
  136.     MMUtils;
  137. {------------------------------------------------------------------------}
  138. { This function solves for x in the equation "x is y% of z". }
  139. function SolveForX(Y, Z: Longint): Longint;
  140. begin
  141.     Result := Trunc(Z*(Y*0.01));
  142. end;
  143. {------------------------------------------------------------------------}
  144. { This function solves for y in the equation "x is y% of z". }
  145. function SolveForY(X, Z: Longint): Longint;
  146. begin
  147.     if Z = 0 then
  148.         Result := 0
  149.     else
  150.         Result := Trunc((X*100.0)/Z);
  151. end;
  152. {== TMMCustomGauge ======================================================}
  153. constructor TMMCustomGauge.Create(AOwner: TComponent);
  154. begin
  155.     inherited Create(AOwner);
  156.     FKind       := defKind;
  157.     FShowText   := defShowText;
  158.     FForeColor  := defForeColor;
  159.     FBackColor  := defBackColor;
  160.     FMinValue   := defMinValue;
  161.     FMaxValue   := defMaxValue;
  162.     FCurValue   := defProgress;
  163.     FBWText     := defBWText;
  164.     Width       := defWidth;
  165.     Height      := defHeight;
  166.     ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  167.     if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  168. end;
  169. {-- TMMCustomGauge ------------------------------------------------------}
  170. procedure TMMCustomGauge.SetGaugeKind(Value: TMMGaugeKind);
  171. begin
  172.     if Value <> FKind then
  173.     begin
  174.         FKind := Value;
  175.         Invalidate;
  176.     end;
  177. end;
  178. {-- TMMCustomGauge ------------------------------------------------------}
  179. procedure TMMCustomGauge.SetShowText(Value: Boolean);
  180. begin
  181.     if Value <> FShowText then
  182.     begin
  183.         FShowText := Value;
  184.         Invalidate;
  185.     end;
  186. end;
  187. {-- TMMCustomGauge ------------------------------------------------------}
  188. procedure TMMCustomGauge.SetForeColor(Value: TColor);
  189. begin
  190.     if Value <> FForeColor then
  191.     begin
  192.         FForeColor := Value;
  193.         Invalidate;
  194.     end;
  195. end;
  196. {-- TMMCustomGauge ------------------------------------------------------}
  197. procedure TMMCustomGauge.SetBackColor(Value: TColor);
  198. begin
  199.     if Value <> FBackColor then
  200.     begin
  201.         FBackColor := Value;
  202.         Invalidate;
  203.     end;
  204. end;
  205. {-- TMMCustomGauge ------------------------------------------------------}
  206. procedure   TMMCustomGauge.SetMinValue(Value: Longint);
  207. begin
  208.     Value := MinMax(Value,-MaxInt,MaxValue);
  209.     if Value <> FMinValue then
  210.     begin
  211.         FMinValue := Value;
  212.         Invalidate;
  213.     end;
  214. end;
  215. {-- TMMCustomGauge ------------------------------------------------------}
  216. procedure TMMCustomGauge.SetMaxValue(Value: Longint);
  217. begin
  218.     Value := MinMax(Value,MinValue,MaxInt);
  219.     if Value <> FMaxValue then
  220.     begin
  221.         FMaxValue := Value;
  222.         Invalidate;
  223.     end;
  224. end;
  225. {-- TMMCustomGauge ------------------------------------------------------}
  226. procedure TMMCustomGauge.SetProgress(Value: Longint);
  227. var
  228.     Old: LongInt;
  229. begin
  230.     Value := MinMax(Value,MinValue,MaxValue);
  231.     if Value <> FCurValue then
  232.     begin
  233.         Old       := PercentDone;
  234.         FCurValue := Value;
  235.         if Old <> PercentDone then
  236.            Refresh;
  237.     end;
  238. end;
  239. {-- TMMCustomGauge ------------------------------------------------------}
  240. procedure TMMCustomGauge.AddProgress(Value: Longint);
  241. begin
  242.     Progress := FCurValue + Value;
  243. end;
  244. {-- TMMCustomGauge ------------------------------------------------------}
  245. procedure TMMCustomGauge.SetCaption(const Value: string);
  246. begin
  247.     if Value <> FCaption then
  248.     begin
  249.         FCaption := Value;
  250.         Invalidate;
  251.     end;
  252. end;
  253. {-- TMMCustomGauge ------------------------------------------------------}
  254. function TMMCustomGauge.GetPercentDone: LongInt;
  255. begin
  256.     Result := SolveForY(FCurValue-FMinValue, FMaxValue-FMinValue);
  257. end;
  258. {-- TMMCustomGauge ------------------------------------------------------}
  259. procedure TMMCustomGauge.Paint;
  260. var
  261.     R: TRect;
  262.     OffScreen: TBitmap;
  263. begin
  264.     R := Bevel.PaintBevel(Canvas,ClientRect,True);
  265.     OffScreen := TBitmap.Create;
  266.     try
  267.         with OffScreen do
  268.         begin
  269.             Width := R.Right  - R.Left;
  270.             Height:= R.Bottom - R.Top;
  271.             PaintImage(Canvas,Bounds(0,0,Width,Height));
  272.             if FShowText then
  273.                 PaintText(Canvas,Bounds(0,0,Width,Height));
  274.         end;
  275.         Canvas.Draw(R.Left,R.Top,OffScreen);
  276.     finally
  277.         OffScreen.Free;
  278.     end;
  279. end;
  280. {-- TMMCustomGauge ------------------------------------------------------}
  281. procedure TMMCustomGauge.PaintImage(Canvas: TCanvas; R: TRect);
  282. begin
  283.     case FKind of
  284.         gkHorizontalBar, gkVerticalBar: PaintAsBar(Canvas,R,FKind = gkHorizontalBar);
  285.         gkPie: PaintAsPie(Canvas,R);
  286.         gkNeedle: PaintAsNeedle(Canvas,R);
  287.     else
  288.         PaintAsNothing(Canvas,R);
  289.     end;
  290. end;
  291. {-- TMMCustomGauge ------------------------------------------------------}
  292. procedure TMMCustomGauge.PaintText(Canvas: TCanvas; R: TRect);
  293. var
  294.     TextBmp : TBitmap;
  295.     Text    : string;
  296.     OldMode : TCopyMode;
  297.     X, Y    : Integer;
  298.     X2, Y2  : Integer;
  299. begin
  300.     if Caption <> '' then
  301.         Text := Format('%s %d%%',[Caption,PercentDone])
  302.     else
  303.         Text := Format('%d%%',[PercentDone]);
  304.     if (((Kind = gkHorizontalBar) or (Kind = gkVerticalBar))) and BWText then
  305.     begin
  306.         Canvas.Font := Self.Font;
  307.         X  := R.Left + (R.Right - R.Left - Canvas.TextWidth(Text)) div 2;
  308.         Y  := R.Top + (R.Bottom - R.Top - Canvas.TextHeight(Text)) div 2;
  309.         X2 := R.Left + SolveForX(PercentDone,R.Right-R.Left);
  310.         Y2 := R.Bottom - SolveForX(PercentDone,R.Bottom-R.Top);
  311.         Canvas.Brush.Style := bsClear;
  312.         if Kind = gkHorizontalBar then
  313.             Canvas.TextRect(Rect(X2,Y,R.Right,R.Bottom),X,Y,Text)
  314.         else
  315.             Canvas.TextRect(Rect(X,Y,R.Right,Y2),X,Y,Text);
  316.         Canvas.Font.Color := ColorToRGB(clWhite) xor Self.Font.Color;
  317.         if Kind = gkHorizontalBar then
  318.             Canvas.TextRect(Rect(X,Y,X2,R.Bottom),X,Y,Text)
  319.         else
  320.             Canvas.TextRect(Rect(X,Y2,R.Right,R.Bottom),X,Y,Text);
  321.     end
  322.     else
  323.     begin
  324.         TextBmp := TBitmap.Create;
  325.         try
  326.             with TextBmp do
  327.             begin
  328.                 Width       := R.Right - R.Left;
  329.                 Height      := R.Bottom - R.Top;
  330.                 Canvas.Brush.Color := clBlack;
  331.                 Canvas.FillRect(Bounds(0,0,Width,Height));
  332.                 Canvas.Font := Self.Font;
  333.                 Canvas.Font.Color := clWhite;
  334.                 X := (Width - Canvas.TextWidth(Text)) div 2;
  335.                 Y := (Height - Canvas.TextHeight(Text)) div 2;
  336.                 Canvas.TextOut(X, Y, Text);
  337.             end;
  338.             OldMode := Canvas.CopyMode;
  339.             try
  340.                 Canvas.CopyMode := cmSrcInvert;
  341.                 Canvas.Draw(R.Left,R.Top,TextBmp);
  342.             finally
  343.                 Canvas.CopyMode := OldMode;
  344.             end;
  345.         finally
  346.             TextBmp.Free;
  347.         end;
  348.     end;
  349. end;
  350. {-- TMMCustomGauge ------------------------------------------------------}
  351. procedure TMMCustomGauge.PaintAsBar(Canvas: TCanvas; R: TRect; Horz: Boolean);
  352. var
  353.     FillSize: Integer;
  354.     W, H    : Integer;
  355. begin
  356.     with Canvas do
  357.     begin
  358.         Brush.Color := BackColor;
  359.         FillRect(R);
  360.         Brush.Color := ForeColor;
  361.         Pen.Width   := 1;
  362.         Pen.Color   := ForeColor;
  363.         W           := R.Right - R.Left;
  364.         H           := R.Bottom - R.Top;
  365.         if Horz then
  366.         begin
  367.             FillSize := SolveForX(PercentDone,W);
  368.             if FillSize > 0 then
  369.                 FillRect(Bounds(R.Left,R.Top,FillSize,H));
  370.         end
  371.         else
  372.         begin
  373.             FillSize := SolveForX(PercentDone,H);
  374.             if FillSize > 0 then
  375.                 FillRect(Bounds(R.Left,R.Top+H-FillSize,W,FillSize));
  376.         end;
  377.     end;
  378. end;
  379. {-- TMMCustomGauge ------------------------------------------------------}
  380. procedure TMMCustomGauge.PaintAsPie(Canvas: TCanvas; R: TRect);
  381. var
  382.     MiddleX, MiddleY: Integer;
  383.     Angle           : Double;
  384.     W, H            : Integer;
  385. begin
  386.     W := R.Right - R.Left;
  387.     H := R.Bottom - R.Top;
  388.     with Canvas do
  389.     begin
  390.         Brush.Color := Color;
  391.         FillRect(R);
  392.         Brush.Color := BackColor;
  393.         Pen.Color := ForeColor;
  394.         Pen.Width := 1;
  395.         Ellipse(R.Left, R.Top, W, H);
  396.         if PercentDone > 0 then
  397.         begin
  398.             Brush.Color := ForeColor;
  399.             MiddleX := W div 2;
  400.             MiddleY := H div 2;
  401.             Angle := (Pi * ((PercentDone / 50) + 0.5));
  402.             Pie(R.Left, R.Top, W, H,
  403.                 Round(MiddleX * (1 - Cos(Angle))),Round(MiddleY * (1 - Sin(Angle))),
  404.                 MiddleX, 0);
  405.         end;
  406.     end;
  407. end;
  408. {-- TMMCustomGauge ------------------------------------------------------}
  409. procedure TMMCustomGauge.PaintAsNeedle(Canvas: TCanvas; R: TRect);
  410. var
  411.     MiddleX     : Integer;
  412.     Angle       : Double;
  413.     X, Y, W, H  : Integer;
  414. begin
  415.     with R do
  416.     begin
  417.         X := Left;
  418.         Y := Top;
  419.         W := Right - Left;
  420.         H := Bottom - Top;
  421.     end;
  422.     with Canvas do
  423.     begin
  424.         Brush.Color := Color;
  425.         FillRect(R);
  426.         Brush.Color := BackColor;
  427.         Pen.Color := ForeColor;
  428.         Pen.Width := 1;
  429.         Pie(X, Y, W, H * 2 - 1, X + W, R.Bottom - 1, X, R.Bottom - 1);
  430.         MoveTo(X, R.Bottom);
  431.         LineTo(X + W, R.Bottom);
  432.         if PercentDone > 0 then
  433.         begin
  434.             Pen.Color := ForeColor;
  435.             MiddleX := Width div 2;
  436.             MoveTo(MiddleX, R.Bottom - 1);
  437.             Angle := (Pi * ((PercentDone / 100)));
  438.             LineTo(Round(MiddleX * (1 - Cos(Angle))),
  439.                    Round((R.Bottom - 1)*(1 - Sin(Angle))));
  440.         end;
  441.     end;
  442. end;
  443. {-- TMMCustomGauge ------------------------------------------------------}
  444. procedure TMMCustomGauge.PaintAsNothing(Canvas: TCanvas; R: TRect);
  445. begin
  446.     with Canvas do
  447.     begin
  448.         Brush.Color := BackColor;
  449.         FillRect(R);
  450.     end;
  451. end;
  452. {-- TMMCustomGauge ------------------------------------------------------}
  453. procedure TMMCustomGauge.SetBWText(Value: Boolean);
  454. begin
  455.     if Value <> FBWText then
  456.     begin
  457.         FBWText := Value;
  458.         Invalidate;
  459.     end;
  460. end;
  461. end.