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

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:05 $                                        =}
  24. {========================================================================}
  25. unit MMWheel;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     Messages,
  36.     Classes,
  37.     SysUtils,
  38.     Controls,
  39.     ExtCtrls,
  40.     Graphics,
  41.     Menus,
  42.     MMObj,
  43.     MMScale;
  44. type
  45.     EMMWheelError      = class(Exception);
  46.     TMMFocusAction     = (faHandleColor,faFrameRect,faAll);
  47.     TMMHandleStyle     = (hsEllipse,hsOwnerDraw);
  48.     TMMDrawHandleEvent = procedure(Sender : TObject; Canvas : TCanvas; Rect : TRect;
  49.                                    Origin : TPoint; Focused : Boolean) of object;
  50.     TMMPaintEvent      = procedure(Sender : TObject; Canvas: TCanvas; Rect : TRect) of object;
  51. const
  52.     {$IFDEF CBUILDER3} {$EXTERNALSYM defMinValue} {$ENDIF}
  53.     defMinValue     = 0;
  54.     {$IFDEF CBUILDER3} {$EXTERNALSYM defMaxValue} {$ENDIF}
  55.     defMaxValue     = 10;
  56.     {$IFDEF CBUILDER3} {$EXTERNALSYM defValue} {$ENDIF}
  57.     defValue        = 0;
  58.     {$IFDEF CBUILDER3} {$EXTERNALSYM defStartAngle} {$ENDIF}
  59.     defStartAngle   = 225;
  60.     {$IFDEF CBUILDER3} {$EXTERNALSYM defEndAngle} {$ENDIF}
  61.     defEndAngle     = 315;
  62.     {$IFDEF CBUILDER3} {$EXTERNALSYM defWidth} {$ENDIF}
  63.     defWidth        = 100;
  64.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHeight} {$ENDIF}
  65.     defHeight       = 100;
  66.     {$IFDEF CBUILDER3} {$EXTERNALSYM defAutoSize} {$ENDIF}
  67.     defAutoSize     = True;
  68.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHandleColor} {$ENDIF}
  69.     defHandleColor  = clMaroon;
  70.     {$IFDEF CBUILDER3} {$EXTERNALSYM defFocusedColor} {$ENDIF}
  71.     defFocusedColor = clRed;
  72.     {$IFDEF CBUILDER3} {$EXTERNALSYM defUpDown} {$ENDIF}
  73.     defUpDown       = False;
  74.     {$IFDEF CBUILDER3} {$EXTERNALSYM defScrollSize} {$ENDIF}
  75.     defScrollSize   = 160;
  76.     {$IFDEF CBUILDER3} {$EXTERNALSYM defLineStep} {$ENDIF}
  77.     defLineStep     = 1;
  78.     {$IFDEF CBUILDER3} {$EXTERNALSYM defPageStep} {$ENDIF}
  79.     defPageStep     = 2;
  80.     {$IFDEF CBUILDER3} {$EXTERNALSYM defFocusAction} {$ENDIF}
  81.     defFocusAction  = faAll;
  82.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHandleStyle} {$ENDIF}
  83.     defHandleStyle  = hsEllipse;
  84.     {$IFDEF CBUILDER3} {$EXTERNALSYM defRadius} {$ENDIF}
  85.     defRadius       = 0;
  86.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHandleSize} {$ENDIF}
  87.     defHandleSize   = 4;
  88.     {$IFDEF CBUILDER3} {$EXTERNALSYM defHandleMargin} {$ENDIF}
  89.     defHandleMargin = 4;
  90.     {$IFDEF CBUILDER3} {$EXTERNALSYM defFrameSpace} {$ENDIF}
  91.     defFrameSpace   = 4;
  92.     {$IFDEF CBUILDER3} {$EXTERNALSYM defScaleMargin} {$ENDIF}
  93.     defScaleMargin  = 3;
  94.     {$IFDEF CBUILDER3} {$EXTERNALSYM defTransparent} {$ENDIF}
  95.     defTransparent  = True;
  96. type
  97.     {-- TMMCustomWheel ---------------------------------------------------}
  98.     TMMCustomWheel = class(TMMCustomControl)
  99.     private
  100.         FAutoSize       : Boolean;
  101.         FBackBmp        : TBitmap;
  102.         FStretched      : TBitmap;
  103.         FMinValue       : Integer;
  104.         FMaxValue       : Integer;
  105.         FValue          : Integer;
  106.         FStartAngle     : Integer;
  107.         FEndAngle       : Integer;
  108.         FHandleColor    : TColor;
  109.         FFocusedColor   : TColor;
  110.         FUpDown         : Boolean;
  111.         FScrollSize     : Integer;
  112.         FLineStep       : Integer;
  113.         FPageStep       : Integer;
  114.         FFocusAction    : TMMFocusAction;
  115.         FScale          : TMMScale;
  116.         FRadius         : Integer;
  117.         FHandleStyle    : TMMHandleStyle;
  118.         FHandleSize     : Integer;
  119.         FFrameSpace     : Integer;
  120.         FScaleMargin    : Integer;
  121.         FHandleMargin   : Integer;
  122.         FTransparent    : Boolean;
  123.         FOnChange       : TNotifyEvent;
  124.         FOnDrawHandle   : TMMDrawHandleEvent;
  125.         FOnPaint        : TMMPaintEvent;
  126.         FAngle          : Integer;
  127.         FDragging       : Boolean;
  128.         FStartY         : Integer;
  129.         FStartValue     : Integer;
  130.         procedure SetAutoSize(Value: Boolean);
  131.         procedure SetBackBmp(Value: TBitmap);
  132.         procedure SetMinValue(Value: Integer);
  133.         procedure SetMaxValue(Value: Integer);
  134.         procedure SetValue(aValue: Integer);
  135.         procedure SetStartAngle(Value: Integer);
  136.         procedure SetEndAngle(Value: Integer);
  137.         procedure SetHandleColor(Value: TColor);
  138.         procedure SetFocusedColor(Value: TColor);
  139.         procedure SetFocusAction(Value: TMMFocusAction);
  140.         procedure SetScrollParam(Index: Integer; Value : Integer);
  141.         procedure SetScale(Value: TMMScale);
  142.         procedure SetRadius(Value: Integer);
  143.         function  GetRadius: Integer;
  144.         procedure SetHandleStyle(Value: TMMHandleStyle);
  145.         procedure SetHandleSize(Value: Integer);
  146.         procedure SetHandleMargin(Value: Integer);
  147.         procedure SetFrameSpace(Value: Integer);
  148.         procedure SetScaleMargin(Value: Integer);
  149.         procedure SetTransparent(Value: Boolean);
  150.         function  GetStretched: TBitmap;
  151.         procedure InitStretched;
  152.         procedure DoneStretched;
  153.         procedure CMColorChanged(var Msg); message CM_COLORCHANGED;
  154.         procedure WMSetFocus(var Msg); message WM_SETFOCUS;
  155.         procedure WMKillFocus(var Msg); message WM_KILLFOCUS;
  156.         procedure ScaleChanged(Sender : TObject);
  157.     protected
  158.         procedure UpdateControl;
  159.         procedure Change; virtual;
  160.         procedure DoChange; dynamic;
  161.         procedure Paint; override;
  162.         procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  163.         procedure RecalcAngle;
  164.         procedure DrawHandle(Angle : Integer); virtual;
  165.         procedure DoDrawHandle(Rect : TRect; Origin : TPoint; Focused : Boolean); dynamic;
  166.         procedure Loaded; override;
  167.         procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  168.         procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  169.         procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  170.         procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  171.         procedure Rotate(X,Y : Integer);
  172.         procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  173.         procedure DoAutoSize;
  174.         function  ScaleSpace: Integer;
  175.         procedure Changed; override;
  176.         procedure CalcSize(var W, H : Integer);
  177.         property  Stretched: TBitmap read GetStretched;
  178.     public
  179.         constructor Create(AOwner : TComponent); override;
  180.         destructor  Destroy; override;
  181.     protected
  182.         property TabStop default True;
  183.         property AutoSize    : Boolean read FAutoSize write SetAutoSize;
  184.         property BackBmp     : TBitmap read FBackBmp write SetBackBmp;
  185.         property MinValue    : Integer read FMinValue write SetMinValue default defMinValue;
  186.         property MaxValue    : Integer read FMaxValue write SetMaxValue default defMaxValue;
  187.         property Value       : Integer read FValue write SetValue default defValue;
  188.         property StartAngle  : Integer read FStartAngle write SetStartAngle default defStartAngle;
  189.         property EndAngle    : Integer read FEndAngle write SetEndAngle default defEndAngle;
  190.         property HandleColor : TColor  read FHandleColor write SetHandleColor default defHandleColor;
  191.         property FocusedColor: TColor  read FFocusedColor write SetFocusedColor default defFocusedColor;
  192.         property UpDown      : Boolean read FUpDown write FUpDown default defUpDown;
  193.         property ScrollSize  : Integer index 0 read FScrollSize write SetScrollParam default defScrollSize;
  194.         property LineStep    : Integer index 1 read FLineStep write SetScrollParam default defLineStep;
  195.         property PageStep    : Integer index 2 read FPageStep write SetScrollParam default defPageStep;
  196.         property FocusAction : TMMFocusAction read FFocusAction write SetFocusAction default defFocusAction;
  197.         property Scale       : TMMScale read FScale write SetScale;
  198.         property Radius      : Integer read GetRadius write SetRadius default defRadius;
  199.         property HandleStyle : TMMHandleStyle read FHandleStyle write SetHandleStyle default defHandleStyle;
  200.         property HandleSize  : Integer read FHandleSize write SetHandleSize default defHandleSize;
  201.         property HandleMargin: Integer read FHandleMargin write SetHandleMargin default defHandleMargin;
  202.         property FrameSpace  : Integer read FFrameSpace write SetFrameSpace default defFrameSpace;
  203.         property ScaleMargin : Integer read FScaleMargin write SetScaleMargin default defScaleMargin;
  204.         property Transparent : Boolean read FTransparent write SetTransparent default defTransparent;
  205.         property OnChange    : TNotifyEvent read FOnChange write FOnChange;
  206.         property OnDrawHandle: TMMDrawHandleEvent read FOnDrawHandle write FOnDrawHandle;
  207.         property OnPaint     : TMMPaintEvent read FOnPaint write FOnPaint;
  208.     end;
  209.     {-- TMMWheel ---------------------------------------------------------}
  210.     TMMWheel = class(TMMCustomWheel)
  211.     published
  212.         property OnEnter;
  213.         property OnExit;
  214.         property OnKeyDown;
  215.         property OnKeyPress;
  216.         property OnKeyUp;
  217.         property OnChange;
  218.         property OnDrawHandle;
  219.         property OnPaint;
  220.         property Bevel;
  221.         property Visible;
  222.         property Color;
  223.         property Enabled;
  224.         property ParentShowHint;
  225.         property PopupMenu;
  226.         property ShowHint;
  227.         property TabStop;
  228.         property TabOrder;
  229.         property Width;
  230.         property Height;
  231.         property AutoSize;
  232.         property BackBmp;
  233.         property MinValue;
  234.         property MaxValue;
  235.         property Value;
  236.         property StartAngle;
  237.         property EndAngle;
  238.         property HandleColor;
  239.         property FocusedColor;
  240.         property UpDown;
  241.         property ScrollSize;
  242.         property LineStep;
  243.         property PageStep;
  244.         property FocusAction;
  245.         property Scale;
  246.         property Radius;
  247.         property HandleStyle;
  248.         property HandleSize;
  249.         property HandleMargin;
  250.         property FrameSpace;
  251.         property ScaleMargin;
  252.         property Transparent;
  253.      end;
  254. {=========================================================================}
  255. implementation
  256. {$IFDEF WIN32}
  257.   {$R MMWHEEL.D32}
  258. {$ELSE}
  259.   {$R MMWHEEL.D16}
  260. {$ENDIF}
  261. uses
  262.     MMMath,
  263.     MMUtils;
  264. {== TMMCustomWheel ======================================================}
  265. constructor TMMCustomWheel.Create(AOwner : TComponent);
  266. begin
  267.    inherited Create(AOwner);
  268.    ControlStyle := ControlStyle -
  269.                    [csAcceptsControls,csFramed,csSetCaption] +
  270.                    [csCaptureMouse,csOpaque];
  271.    Width           := defWidth;
  272.    Height          := defHeight;
  273.    FScale          := TMMScale.Create;
  274.    FScale.OnChange := ScaleChanged;
  275.    FBackBmp        := TBitmap.Create;
  276.    FBackBmp.Width  := defWidth;
  277.    FBackBmp.Height := defHeight;
  278.    BackBmp := nil;   { set default bitmap }
  279.    FAutoSize       := defAutoSize;
  280.    FMinValue       := defMinValue;
  281.    FMaxValue       := defMaxValue;
  282.    FValue          := defValue;
  283.    FStartAngle     := defStartAngle;
  284.    FEndAngle       := defEndAngle;
  285.    FHandleColor    := defHandleColor;
  286.    FUpDown         := defUpDown;
  287.    FScrollSize     := defScrollSize;
  288.    FLineStep       := defLineStep;
  289.    FPageStep       := defPageStep;
  290.    FFocusAction    := defFocusAction;
  291.    FFocusedColor   := defFocusedColor;
  292.    FHandleStyle    := defHandleStyle;
  293.    FHandleSize     := defHandleSize;
  294.    FHandleMargin   := defHandleMargin;
  295.    FFrameSpace     := defFrameSpace;
  296.    FScaleMargin    := defScaleMargin;
  297.    FTransparent    := defTransparent;
  298.    Bevel.BevelOuter:= bvNone;
  299.    TabStop         := True;
  300.    RecalcAngle;
  301.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  302.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  303. end;
  304. {-- TMMCustomWheel ------------------------------------------------------}
  305. destructor TMMCustomWheel.Destroy;
  306. begin
  307.    DoneStretched;
  308.    FBackBmp.Free;
  309.    FScale.Free;
  310.    inherited Destroy;
  311. end;
  312. {-- TMMCustomWheel ------------------------------------------------------}
  313. procedure TMMCustomWheel.SetAutoSize(Value : Boolean);
  314. begin
  315.    if FAutoSize <> Value then
  316.    begin
  317.       FAutoSize := Value;
  318.       if FAutoSize then
  319.          DoAutoSize;
  320.    end;
  321. end;
  322. {-- TMMCustomWheel ------------------------------------------------------}
  323. procedure TMMCustomWheel.SetBackBmp(Value : TBitmap);
  324. begin
  325.    if (Value <> nil) then
  326.        FBackBmp.Assign(Value)
  327.    else
  328.        FBackBmp.Handle := LoadBitmap(HInstance, 'BM_WHEEL');
  329.    DoneStretched;
  330.    if FAutoSize then
  331.       DoAutoSize;
  332.    Repaint;
  333. end;
  334. {-- TMMCustomWheel ------------------------------------------------------}
  335. procedure TMMCustomWheel.SetMinValue(Value : Integer);
  336. begin
  337.    if Value <> FMinValue then
  338.    begin
  339.       FMinValue := Value;
  340.       UpdateControl;
  341.    end;
  342. end;
  343. {-- TMMCustomWheel ------------------------------------------------------}
  344. procedure TMMCustomWheel.SetMaxValue(Value : Integer);
  345. begin
  346.    if Value <> FMaxValue then
  347.    begin
  348.       FMaxValue := Value;
  349.       UpdateControl;
  350.    end;
  351. end;
  352. {-- TMMCustomWheel ------------------------------------------------------}
  353. procedure TMMCustomWheel.SetValue(aValue : Integer);
  354. begin
  355.    aValue := MinMax(aValue, FMinValue, FMaxValue);
  356.    if FValue <> aValue then
  357.    begin
  358.       FValue := aValue;
  359.       UpdateControl;
  360.       Change;
  361.    end;
  362. end;
  363. {-- TMMCustomWheel ------------------------------------------------------}
  364. procedure TMMCustomWheel.SetStartAngle(Value : Integer);
  365. begin
  366.    Value := MinMax(Value, 0, 360);
  367.    if Value <> FStartAngle then
  368.    begin
  369.       FStartAngle := Value;
  370.       UpdateControl;
  371.    end;
  372. end;
  373. {-- TMMCustomWheel ------------------------------------------------------}
  374. procedure TMMCustomWheel.SetEndAngle(Value : Integer);
  375. begin
  376.    Value := MinMax(Value, 0, 360);
  377.    if Value <> FEndAngle then
  378.    begin
  379.       FEndAngle := Value;
  380.       UpdateControl;
  381.    end;
  382. end;
  383. {-- TMMCustomWheel ------------------------------------------------------}
  384. procedure TMMCustomWheel.SetHandleColor(Value : TColor);
  385. begin
  386.    if Value <> FHandleColor then
  387.    begin
  388.       FHandleColor := Value;
  389.       UpdateControl;
  390.    end;
  391. end;
  392. {-- TMMCustomWheel ------------------------------------------------------}
  393. procedure TMMCustomWheel.SetTransparent(Value : Boolean);
  394. begin
  395.    if Value <> FTransparent then
  396.    begin
  397.       FTransparent := Value;
  398.       Invalidate;
  399.    end;
  400. end;
  401. {-- TMMCustomWheel ------------------------------------------------------}
  402. procedure TMMCustomWheel.SetScrollParam(Index : Integer; Value : Integer);
  403. begin
  404.    if Value <= 0 then
  405.       { TODO: Should be resource id }
  406.       raise EMMWheelError.Create('This parameter should be greater then 0');
  407.    case Index of
  408.       0 : FScrollSize := Value;
  409.       1 : FLineStep := Value;
  410.       2 : FPageStep := Value;
  411.    end;
  412. end;
  413. {-- TMMCustomWheel ------------------------------------------------------}
  414. procedure TMMCustomWheel.SetFocusedColor(Value : TColor);
  415. begin
  416.    if Value <> FFocusedColor then
  417.    begin
  418.       FFocusedColor := Value;
  419.       UpdateControl;
  420.    end;
  421. end;
  422. {-- TMMCustomWheel ------------------------------------------------------}
  423. procedure TMMCustomWheel.SetFocusAction(Value : TMMFocusAction);
  424. begin
  425.    if Value <> FFocusAction then
  426.    begin
  427.       FFocusAction := Value;
  428.       UpdateControl;
  429.    end;
  430. end;
  431. {-- TMMCustomWheel ------------------------------------------------------}
  432. procedure TMMCustomWheel.SetScale(Value: TMMScale);
  433. begin
  434.    FScale.Assign(Value);
  435. end;
  436. {-- TMMCustomWheel ------------------------------------------------------}
  437. procedure TMMCustomWheel.SetRadius(Value : Integer);
  438. begin
  439.    Value := MinMax(Value,0,MaxInt);
  440.    if Value <> FRadius then
  441.    begin
  442.       FRadius := Value;
  443.       UpdateControl;
  444.    end;
  445. end;
  446. {-- TMMCustomWheel ------------------------------------------------------}
  447. function TMMCustomWheel.GetRadius : Integer;
  448. begin
  449.    if FRadius = 0 then
  450.       Result := Min(Width,Height) div 2 - HandleMargin - BevelExtend - FrameSpace - ScaleSpace
  451.    else
  452.       Result := FRadius;
  453. end;
  454. {-- TMMCustomWheel ------------------------------------------------------}
  455. procedure TMMCustomWheel.SetHandleStyle(Value : TMMHandleStyle);
  456. begin
  457.    if FHandleStyle <> Value then
  458.    begin
  459.       FHandleStyle := Value;
  460.       UpdateControl;
  461.    end;
  462. end;
  463. {-- TMMCustomWheel ------------------------------------------------------}
  464. procedure TMMCustomWheel.SetHandleSize(Value : Integer);
  465. begin
  466.    Value := MinMax(Value, 2, MaxInt);
  467.    if FHandleSize <> Value then
  468.    begin
  469.       FHandleSize := Value;
  470.       UpdateControl;
  471.    end;
  472. end;
  473. {-- TMMCustomWheel ------------------------------------------------------}
  474. procedure TMMCustomWheel.SetHandleMargin(Value : Integer);
  475. begin
  476.    Value := MinMax(Value, 0, MaxInt);
  477.    if FHandleMargin <> Value then
  478.    begin
  479.       FHandleMargin := Value;
  480.       UpdateControl;
  481.    end;
  482. end;
  483. {-- TMMCustomWheel ------------------------------------------------------}
  484. procedure TMMCustomWheel.SetFrameSpace(Value : Integer);
  485. begin
  486.    Value := MinMax(Value,0,MaxInt);
  487.    if FFrameSpace <> Value then
  488.    begin
  489.       FFrameSpace := Value;
  490.       DoneStretched;
  491.       if AutoSize then
  492.          DoAutoSize;
  493.    end;
  494. end;
  495. {-- TMMCustomWheel ------------------------------------------------------}
  496. procedure TMMCustomWheel.SetScaleMargin(Value : Integer);
  497. begin
  498.    Value := MinMax(Value,0,MaxInt);
  499.    if FScaleMargin <> Value then
  500.    begin
  501.       FScaleMargin := Value;
  502.       DoneStretched;
  503.       if AutoSize then
  504.          DoAutoSize;
  505.    end;
  506. end;
  507. {-- TMMCustomWheel ------------------------------------------------------}
  508. procedure TMMCustomWheel.ScaleChanged(Sender : TObject);
  509. begin
  510.    DoneStretched;
  511.    if AutoSize then
  512.       DoAutoSize;
  513.    UpdateControl;
  514. end;
  515. {-- TMMCustomWheel ------------------------------------------------------}
  516. procedure TMMCustomWheel.InitStretched;
  517. var
  518.    Temp   : TBitmap;
  519.    SWidth : Integer;
  520.    SHeight: Integer;
  521.    BWidth : Integer;
  522.    BHeight: Integer;
  523.    R      : TRect;
  524.    SRect  : TRect;
  525. begin
  526.    SWidth  := Width - BevelExtend * 2;
  527.    SHeight := Height - BevelExtend * 2;
  528.    if SWidth < 0 then
  529.       SWidth := 0;
  530.    if SHeight < 0 then
  531.       SHeight := 0;
  532.    FStretched        := TBitmap.Create;
  533.    FStretched.Width  := SWidth;
  534.    FStretched.Height := SHeight;
  535.    if (SWidth = 0) or (SHeight = 0) then Exit;
  536.    SRect := Bounds(0,0,SWidth,SHeight);
  537.    FStretched.Canvas.Font:= Font;
  538.    FScale.Canvas         := FStretched.Canvas;
  539.    Temp := TBitmap.Create;
  540.    try
  541.       FStretched.Canvas.Brush.Color := Color;
  542.       FStretched.Canvas.FillRect(SRect);
  543.       R := SRect;
  544.       InflateRect(R,-(FrameSpace+ScaleSpace),-(FrameSpace+ScaleSpace));
  545.       BWidth  := R.Right - R.Left;
  546.       BHeight := R.Bottom - R.Top;
  547.       if (BWidth > 0) and (BHeight > 0) then
  548.       begin
  549.          Temp.Width  := BWidth;
  550.          Temp.Height := BHeight;
  551.          Temp.Canvas.CopyRect(Bounds(0, 0, BWidth, BHeight),
  552.                               FBackBmp.Canvas,
  553.                               Bounds(0, 0, FBackBmp.Width, FBackBmp.Height));
  554.          if Transparent then
  555.             FStretched.Canvas.BrushCopy(R, Temp,
  556.                                         Bounds(0, 0, BWidth, BHeight),
  557.                                         Temp.TransparentColor)
  558.          else
  559.             FStretched.Canvas.CopyRect(R, Temp.Canvas,
  560.                                        Bounds(0, 0, BWidth, BHeight));
  561.       end;
  562.    finally
  563.      Temp.Free;
  564.    end;
  565.    if FScale.Visible then
  566.    with FScale do
  567.    begin
  568.       MinValue := Self.MinValue;
  569.       MaxValue := Self.MaxValue;
  570.       StartAngle := Self.StartAngle;
  571.       EndAngle   := Self.EndAngle;
  572.       R          := SRect;
  573.       InflateRect(R,-(FrameSpace),-(FrameSpace));
  574.       DrawElliptic(FStretched.Canvas, R);
  575.    end;
  576.    if ((FocusAction = faFrameRect) or (FocusAction = faAll)) then
  577.        if Focused then
  578.        begin
  579.           R           := SRect;
  580.           InflateRect(R,-(FrameSpace-2),-(FrameSpace-2));
  581.           FStretched.Canvas.DrawFocusRect(R);
  582.        end;
  583. end;
  584. {-- TMMCustomWheel ------------------------------------------------------}
  585. procedure TMMCustomWheel.DoneStretched;
  586. begin
  587.    FStretched.Free;
  588.    FStretched := nil;
  589. end;
  590. {-- TMMCustomWheel ------------------------------------------------------}
  591. procedure TMMCustomWheel.CalcSize(var W, H : Integer);
  592. var
  593.    Space : Integer;
  594. begin
  595.    Space := BevelExtend + FrameSpace + ScaleSpace;
  596.    W := FBackBmp.Width + 2*Space;
  597.    H := FBackBmp.Height + 2*Space;
  598. end;
  599. {-- TMMCustomWheel ------------------------------------------------------}
  600. procedure TMMCustomWheel.DoAutoSize;
  601. var
  602.    W, H: Integer;
  603. begin
  604.    if csLoading in ComponentState then Exit;
  605.    CalcSize(W,H);
  606.    SetBounds(Left, Top, W, H);
  607. end;
  608. {-- TMMCustomWheel ------------------------------------------------------}
  609. function TMMCustomWheel.ScaleSpace  : Integer;
  610. begin
  611.    if Scale.Visible then
  612.       Result := Scale.ScaleHeight + ScaleMargin
  613.    else
  614.       Result := 0;
  615. end;
  616. {-- TMMCustomWheel ------------------------------------------------------}
  617. procedure TMMCustomWheel.UpdateControl;
  618. begin
  619.    if not (csLoading in ComponentState) then
  620.    begin
  621.       RecalcAngle;
  622.       Invalidate;
  623.    end;
  624. end;
  625. {-- TMMCustomWheel ------------------------------------------------------}
  626. procedure TMMCustomWheel.Change;
  627. begin
  628.    DoChange;
  629. end;
  630. {-- TMMCustomWheel ------------------------------------------------------}
  631. procedure TMMCustomWheel.DoChange;
  632. begin
  633.    if (csLoading in ComponentState) or
  634.       (csReading in ComponentState) then exit;
  635.    if Assigned(FOnChange) then FOnChange(Self);
  636. end;
  637. {-- TMMCustomWheel ------------------------------------------------------}
  638. procedure TMMCustomWheel.RecalcAngle;
  639. var
  640.    dVal : Extended;
  641.    dAng : Extended;
  642. begin
  643.    if FMinValue >= FMaxValue then
  644.       dVal := 0
  645.    else
  646.       dVal := (FValue - FMinValue) / (FMaxValue - FMinValue);
  647.    if FStartAngle > FEndAngle then
  648.       dAng := 360
  649.    else
  650.       dAng := FStartAngle + (360 - FEndAngle);
  651.    FAngle := Round(FStartAngle - dVal * dAng);
  652.    if FAngle < 0 then
  653.       FAngle := FAngle + 360;
  654. end;
  655. {-- TMMCustomWheel ------------------------------------------------------}
  656. procedure TMMCustomWheel.Paint;
  657. begin
  658.    with Canvas do
  659.    begin
  660.       { Do not use inherited Paint because we don't need to clear space }
  661.       { before blitting }
  662.       if assigned(FOnPaint) then
  663.          FOnPaint(Self,Canvas,ClientRect)
  664.       else
  665.       begin
  666.          Bevel.PaintBevel(Canvas,ClientRect,True);
  667.          Draw(BevelExtend, BevelExtend, Stretched);
  668.       end;
  669.       DrawHandle(FAngle);
  670.    end;
  671. end;
  672. {-- TMMCustomWheel ------------------------------------------------------}
  673. procedure TMMCustomWheel.DrawHandle(Angle : Integer);
  674. var
  675.    X, Y: Integer;
  676.    HS  : Integer;
  677. begin
  678.    X    := (Width div 2) + Round(Radius * cos(Angle / 180 * Pi));
  679.    Y    := (Height div 2) - Round(Radius * sin(Angle / 180 * Pi));
  680.    with Canvas do
  681.    begin
  682.       if Focused and ((FocusAction = faHandleColor) or (FocusAction = faAll)) then
  683.          Brush.Color := FocusedColor
  684.       else
  685.          Brush.Color := HandleColor;
  686.       Brush.Style := bsSolid;
  687.       Pen.Style   := psSolid;
  688.       Pen.Color   := Brush.Color;
  689.       if HandleStyle = hsOwnerDraw then
  690.          DoDrawHandle(ClientRect, Point(X,Y), Focused)
  691.       else
  692.       begin
  693.          HS := HandleSize div 2;
  694.          Ellipse(X-HS,Y-HS,X+HS,Y+HS);
  695.       end;
  696.    end;
  697. end;
  698. {-- TMMCustomWheel ------------------------------------------------------}
  699. procedure TMMCustomWheel.DoDrawHandle(Rect : TRect; Origin : TPoint; Focused : Boolean);
  700. begin
  701.    if Assigned(FOnDrawHandle) then
  702.       FOnDrawHandle(Self,Canvas,Rect,Origin,Focused);
  703. end;
  704. {-- TMMCustomWheel ------------------------------------------------------}
  705. procedure TMMCustomWheel.Loaded;
  706. begin
  707.    inherited Loaded;
  708.    if AutoSize then
  709.       DoAutoSize;
  710.    UpdateControl;
  711. end;
  712. {-- TMMCustomWheel ------------------------------------------------------}
  713. function TMMCustomWheel.GetStretched: TBitmap;
  714. begin
  715.    if FStretched = nil then
  716.       InitStretched;
  717.    Result := FStretched;
  718. end;
  719. {-- TMMCustomWheel ------------------------------------------------------}
  720. procedure TMMCustomWheel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  721. begin
  722.    if AutoSize then
  723.       CalcSize(AWidth,AHeight);
  724.    inherited SetBounds(ALeft,ATop,AWidth,AHeight);
  725.    DoneStretched;
  726.    Invalidate;
  727. end;
  728. {-- TMMCustomWheel ------------------------------------------------------}
  729. procedure TMMCustomWheel.CMColorChanged(var Msg);
  730. begin
  731.    DoneStretched;
  732.    inherited;
  733. end;
  734. {-- TMMCustomWheel ------------------------------------------------------}
  735. procedure TMMCustomWheel.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  736. begin
  737.    if (Button = mbLeft) and not FDragging then
  738.    begin
  739.       FDragging := True;
  740.       SetFocus;
  741.       if not FUpDown then
  742.          Rotate(X,Y)
  743.       else
  744.       begin
  745.          FStartY         := Y;
  746.          FStartValue     := Value;
  747.       end;
  748.    end;
  749. end;
  750. {-- TMMCustomWheel ------------------------------------------------------}
  751. procedure TMMCustomWheel.MouseMove(Shift: TShiftState; X, Y: Integer);
  752. begin
  753.    if (ssLeft in Shift) and FDragging then
  754.       if not FUpDown then
  755.          Rotate(X,Y)
  756.       else
  757.          Value := FStartValue + Round((FStartY - Y) * (MaxValue - MinValue) / ScrollSize);
  758. end;
  759. {-- TMMCustomWheel ------------------------------------------------------}
  760. procedure TMMCustomWheel.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  761. begin
  762.    if (Button = mbLeft) and FDragging then
  763.    begin
  764.       FDragging := False;
  765.       if not FUpDown then
  766.          Rotate(X,Y);
  767.    end;
  768. end;
  769. {-- TMMCustomWheel ------------------------------------------------------}
  770. procedure TMMCustomWheel.KeyDown(var Key: Word; Shift: TShiftState);
  771. begin
  772.    inherited KeyDown(Key,Shift);
  773.    case Key of
  774.       VK_DOWN, VK_LEFT: Value := Value - FLineStep;
  775.       VK_UP, VK_RIGHT : Value := Value + FLineStep;
  776.       VK_NEXT         : Value := Value - FPageStep;
  777.       VK_PRIOR        : Value := Value + FPageStep;
  778.       VK_HOME         : Value := FMaxValue;
  779.       VK_END          : Value := FMinValue;
  780.      else
  781.         Exit;
  782.    end;
  783.    Key := 0;
  784. end;
  785. {-- TMMCustomWheel ------------------------------------------------------}
  786. procedure TMMCustomWheel.Rotate(X, Y : Integer);
  787. var
  788.    dX, dY : Extended;
  789.    dAngle : Extended;
  790.    Ang    : Extended;
  791.    S, E   : Extended;
  792. begin
  793.    dX := X - (Width div 2);
  794.    dY := (Height div 2) - Y;
  795.    if (dX = 0) and (dY = 0) then Exit;
  796.    Ang := ArcTan2(dY, dX) / Pi * 180;
  797.    if Ang < 0 then
  798.       Ang := 360 + Ang;
  799.    S := FStartAngle;
  800.    if FStartAngle > FEndAngle then
  801.       E := S
  802.    else
  803.       E := FEndAngle;
  804.    dAngle := S + (360 - E);
  805.    if (Ang > S) and (Ang < E) then
  806.        if (Ang - S) < ((E - S) / 2) then
  807.            Ang := S
  808.        else
  809.            Ang := E;
  810.    Ang := FStartAngle - Ang;
  811.    if Ang < 0 then
  812.       Ang := 360 + Ang;
  813.    if (MaxValue < MinValue) or (dAngle = 0) then
  814.        Value := MinValue
  815.    else
  816.        Value := Round((MaxValue - MinValue) * (Ang / dAngle)) + MinValue;
  817. end;
  818. {-- TMMCustomWheel ------------------------------------------------------}
  819. procedure TMMCustomWheel.WMGetDlgCode(var Message: TWMGetDlgCode);
  820. begin
  821.    Message.Result := DLGC_WANTARROWS;
  822. end;
  823. {-- TMMCustomWheel ------------------------------------------------------}
  824. procedure TMMCustomWheel.WMSetFocus(var Msg);
  825. begin
  826.    DoneStretched;
  827.    UpdateControl;
  828. end;
  829. {-- TMMCustomWheel ------------------------------------------------------}
  830. procedure TMMCustomWheel.WMKillFocus(var Msg);
  831. begin
  832.    DoneStretched;
  833.    UpdateControl;
  834. end;
  835. {-- TMMCustomWheel ------------------------------------------------------}
  836. procedure TMMCustomWheel.Changed;
  837. begin
  838.    { Looks like bevel has changed }
  839.    DoneStretched;
  840.    if AutoSize then
  841.       DoAutoSize;
  842.    UpdateControl;
  843. end;
  844. end.