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

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  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: 30.03.98 - 16:35:32 $                                        =}
  24. {========================================================================}
  25. unit MMSlider;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     Forms,
  36.     SysUtils,
  37.     Messages,
  38.     Classes,
  39.     Graphics,
  40.     Controls,
  41.     Dialogs,
  42.     ExtCtrls,
  43.     Menus,
  44.     MMObj,
  45.     MMUtils,
  46.     MMBCache,
  47.     MMMath,
  48.     MMString,
  49.     MMScale;
  50. type
  51.   TMMOrientation    = (orVertical,orHorizontal);
  52.   TMMThumbStyle     = (tsRect,tsOwnerDraw);
  53.   TMMGrooveStyle    = (gsRect,gsOwnerDraw);
  54.   TMMFocusAction    = (faNone, faFocusThumb, faFocusRect, faFocusColor, faAll);
  55.   TMMScalePos       = (spAboveOrLeft, spBelowOrRight, spBoth);
  56.   TMMThumbDrawEvent = procedure(Sender: TObject; aCanvas: TCanvas; aRect: TRect;
  57.                                 Dragged,Focused: Boolean) of object;
  58.   TMMGrooveDrawEvent= procedure(Sender: TObject; aCanvas: TCanvas; var aRect: TRect) of object;
  59.   {-- TMMCustomSlider ---------------------------------------------------}
  60.   TMMCustomSlider = class(TMMCustomControl)
  61.   private
  62.     FDragging                : Boolean;
  63.     FGroove                  : TMMBevel;
  64.     FHandCursor              : Boolean;
  65.     FThumbCursor             : TCursor;
  66.     FMax,FMin,FPosition      : Longint;
  67.     FLineSize                : Integer;
  68.     FPageSize                : Integer;
  69.     FOrientation             : TMMOrientation;
  70.     FFocusAction             : TMMFocusAction;
  71.     FThumbWidth, FThumbHeight: Byte;
  72.     FThumbColor              : TColor;
  73.     FThumbBorder             : Boolean;
  74.     FGrooveColor             : TColor;
  75.     FFocusColor              : TColor;
  76.     FDisabledColor           : TColor;
  77.     FFocusTime               : Boolean;
  78.     FScaleDistance           : Integer;
  79.     FScalePos                : TMMScalePos;
  80.     FScale                   : TMMScale;
  81.     FGrooveSize              : Byte;
  82.     FThumbStyle              : TMMThumbStyle;
  83.     FGrooveStyle             : TMMGrooveStyle;
  84.     FBitmap                  : TBitmap;
  85.     FForceChange             : Boolean;
  86.     FDragOffset              : integer;
  87.     FDragVal                 : Longint;
  88.     HalfTW,HalfTH            : Integer;
  89.     FThumbRect               : TRect;
  90.     FPicLeft                 : TBitmap;
  91.     FPicRight                : TBitmap;
  92.     FSensitivity             : integer;
  93.     FLogMode                 : Boolean;
  94.     FNeedTrackEnd            : Boolean;
  95.     FOnChange                : TNotifyEvent;
  96.     FOnTrack                 : TNotifyEvent;
  97.     FOnTrackEnd              : TNotifyEvent;
  98.     FOnDrawThumb             : TMMThumbDrawEvent;
  99.     FOnDrawGroove            : TMMGrooveDrawEvent;
  100.     FOnGetFocus              : TNotifyEvent; { Added January, 30 2000 }
  101.     FOnLostFocus             : TNotifYEvent; { Added January, 30 2000 }
  102.     FOnMouseEnter            : TNotifyEvent; { Added January, 30 2000 }
  103.     FOnMouseLeave            : TNotifyEvent; { Added January, 30 2000 }
  104.     procedure SetColors(index: integer; aValue: TColor);
  105.     procedure SetMax(aValue: Longint);
  106.     procedure SetMin(aValue: Longint);
  107.     procedure SetOrientation(aValue: TMMOrientation);
  108.     procedure SetPosition(aValue: Longint);
  109.     function  GetPosition: Longint;
  110.     function  UpdatePosition(aValue: Longint): Boolean;
  111.     procedure UpdateFocusTimer(Enable: Boolean);
  112.     procedure SetScaleDist(aValue: Integer);
  113.     procedure SetScalePos(aValue: TMMScalePos);
  114.     procedure SetScale(Value: TMMScale);
  115.     procedure SetFocusAction(aValue: TMMFocusAction);
  116.     procedure SetGrooveSize(aValue: Byte);
  117.     procedure SetThumbSize(index: integer; aValue: Byte);
  118.     procedure SetThumbBorder(aValue: Boolean);
  119.     procedure SetThumbStyle(aValue: TMMThumbStyle);
  120.     procedure SetGrooveStyle(aValue: TMMGrooveStyle);
  121.     procedure SetSensitivity(aValue: integer);
  122.     procedure SetLogMode(aValue: Boolean);
  123.     procedure SetGroove(aValue: TMMBevel);
  124.     procedure GrooveChanged(Sender: TObject);
  125.     procedure ScaleChanged(Sender: TObject);
  126.     procedure TimerAction(Sender: TObject);
  127.     procedure UpdateBitmap(aWidth,aHeight: integer);
  128.     function  NewPosition(WhereX,WhereY: Integer): integer;
  129.     function  IsVert: Boolean;
  130.     procedure WhereIsThumb(const ClientRect: TRect; var aRect: TRect);
  131.     procedure DrawTrench(Canvas: TCanvas; aRect: TRect);
  132.     procedure DrawScale(Canvas: TCanvas; aRect: TRect);
  133.     procedure DrawThumb(Canvas: TCanvas; aRect: TRect);
  134.     function  DrawGroove(Canvas: TCanvas; aRect: TRect): TRect;
  135.     function  DrawPics(Canvas: TCanvas; aRect: TRect): TRect;
  136.     procedure SetPicLeft(Value: TBitmap);
  137.     procedure SetPicRight(Value: TBitmap);
  138.     procedure PicChanged(Sender: TObject);
  139.     function  CalcClientRect: TRect;
  140.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SetFocus;
  141.     procedure WMKillFocus(var Message: TWMKillFocus); message WM_KillFocus;
  142.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  143.     procedure WMSize(var Message: TWMSize); message WM_SIZE;
  144.     procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  145.     procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; { Added January, 30 2000 }
  146.     procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; { Added January, 30 2000 }
  147.   protected
  148.     procedure Change; dynamic;
  149.     procedure Track; dynamic;
  150.     procedure TrackEnd; dynamic;
  151.     procedure OwnerDrawThumb(aCanvas: TCanvas; aRect: TRect; Dragged,Focused: Boolean); dynamic;
  152.     procedure OwnerDrawGroove(aCanvas: TCanvas; var aRect: TRect); dynamic;
  153.     procedure Paint; override;
  154.     procedure Loaded; override;
  155.     procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
  156.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  157.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  158.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  159.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  160.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  161.     procedure SetThumbCursor(AtThumb: Boolean);
  162.   public
  163.     constructor Create(AOwner: TComponent); override;
  164.     destructor Destroy; override;
  165.     procedure SetMinMax(aMin,aMax: Longint);
  166.   protected
  167.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  168.     property OnTrack: TNotifyEvent read FOnTrack write FOnTrack;
  169.     property OnTrackEnd: TNotifyEvent read FOnTrackEnd write FOnTrackEnd;
  170.     property OnDrawThumb: TMMThumbDrawEvent read FOnDrawThumb write FOnDrawThumb;
  171.     property OnDrawGroove: TMMGrooveDrawEvent read FOnDrawGroove write FOnDrawGroove;
  172.     property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  173.     property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  174.     property OnGetFocus: TNotifyEvent read FOnGetFOcus write FOnGetFocus;
  175.     property OnLostFocus: TNotifyEvent read FOnLostFocus write FOnLostFocus;
  176.     property TabStop default True;
  177.     property Width default 200;
  178.     property Height default 40;
  179.     property Groove: TMMBevel read FGroove write SetGroove;
  180.     property FocusAction: TMMFocusAction read FFocusAction write SetFocusAction default faFocusRect;
  181.     property FocusColor: TColor index 0 read FFocusColor write SetColors default clActiveCaption;
  182.     property GrooveColor: TColor index 1 read FGrooveColor write SetColors default clBtnFace;
  183.     property ThumbColor: TColor index 2 read FThumbColor write SetColors default clBtnFace;
  184.     property DisabledColor: TColor index 3 read FDisabledColor write SetColors default clWhite;
  185.     property HandCursor: Boolean read FHandCursor write FHandCursor default False;
  186.     property ThumbCursor: TCursor read FThumbCursor write FThumbCursor default crDefault;
  187.     property MinValue: Longint read FMin write SetMin default 0;
  188.     property MaxValue: Longint read FMax write SetMax default 10;
  189.     property LineSize: Integer read FLineSize write FLineSize default 1;
  190.     property PageSize: Integer read FPageSize write FPageSize default 5;
  191.     property Orientation: TMMOrientation read FOrientation write SetOrientation default orHorizontal;
  192.     property Position: Longint read GetPosition write SetPosition default 0;
  193.     property GrooveSize: Byte read FGrooveSize write SetGrooveSize default 3;
  194.     property GrooveStyle: TMMGrooveStyle read FGrooveStyle write SetGrooveStyle default gsRect;
  195.     property ThumbWidth: Byte index 0 read FThumbWidth write SetThumbSize default 11;
  196.     property ThumbHeight: Byte index 1 read FThumbHeight write SetThumbSize default 23;
  197.     property ThumbStyle: TMMThumbStyle read FThumbStyle write SetThumbStyle default tsRect;
  198.     property ThumbBorder: Boolean read FThumbBorder write SetThumbBorder default True;
  199.     property ScaleDistance: Integer read FScaleDistance write SetScaleDist default 10;
  200.     property ScalePosition: TMMScalePos read FScalePos write SetScalePos default spBelowOrRight;
  201.     property Scale: TMMScale read FScale write SetScale;
  202.     property PicLeft: TBitmap read FPicLeft write SetPicLeft;
  203.     property PicRight: TBitmap read FPicRight write SetPicRight;
  204.     property Logarithmic: Boolean read FLogMode write SetLogMode default False;
  205.     property Sensitivity: Integer read FSensitivity write SetSensitivity default -24;
  206.   end;
  207.   {-- TMMSlider ---------------------------------------------------------}
  208.   TMMSlider = class(TMMCustomSlider)
  209.   published
  210.     property OnEnter;
  211.     property OnExit;
  212.     property OnKeyDown;
  213.     property OnKeyPress;
  214.     property OnKeyUp;
  215.     property OnChange;
  216.     property OnTrack;
  217.     property OnTrackEnd;
  218.     property OnDrawThumb;
  219.     property OnDrawGroove;
  220.     property OnMouseEnter; { Added January, 30 2000 }
  221.     property OnMouseLeave; { Added January, 30 2000 }
  222.     property OnGetFocus;   { Added January, 30 2000 }
  223.     property OnLostFocus;  { Added January, 30 2000 }
  224.     property Align;
  225.     property Visible;
  226.     property Color;
  227.     property Enabled;
  228.     property ParentShowHint;
  229.     property PopupMenu;
  230.     property ShowHint;
  231.     property TabStop;
  232.     property TabOrder;
  233.     property Width;
  234.     property Height;
  235.     property Bevel;
  236.     property Groove;
  237.     property FocusAction;
  238.     property FocusColor;
  239.     property GrooveColor;
  240.     property ThumbColor;
  241.     property ThumbBorder;
  242.     property DisabledColor;
  243.     property HandCursor;
  244.     property ThumbCursor;
  245.     property MinValue;
  246.     property MaxValue;
  247.     property LineSize;
  248.     property PageSize;
  249.     property Orientation;
  250.     property Position;
  251.     property GrooveSize;
  252.     property ThumbWidth;
  253.     property ThumbHeight;
  254.     property ThumbStyle;
  255.     property GrooveStyle;
  256.     property ScaleDistance;
  257.     property ScalePosition;
  258.     property Scale;
  259.     property PicLeft;
  260.     property PicRight;
  261.     property Logarithmic;
  262.     property Sensitivity;
  263.   end;
  264. implementation
  265. const
  266.      FocusTimer: TTimer = nil;
  267.      
  268. {== TMMCustomSlider =====================================================}
  269. constructor TMMCustomSlider.Create(AOwner: TComponent);
  270. begin
  271.    inherited Create(AOwner);
  272.    FBitmap := nil;
  273.    FGroove := TMMBevel.Create;
  274.    FGroove.OnChange := GrooveChanged;
  275.    Bevel.BorderWidth := 5;
  276.    Height := 40;
  277.    Width := 200;
  278.    FFocusAction:= faFocusRect;
  279.    FHandCursor := False;
  280.    FThumbCursor := crDefault;
  281.    FMin := 0;
  282.    FMax := 10;
  283.    FForceChange := False;
  284.    FLineSize := 1;
  285.    FPageSize := 5;
  286.    FOrientation := orHorizontal;
  287.    FPosition := 0;
  288.    FGrooveSize := 3;
  289.    FDragging := False;
  290.    FDragVal := 0;
  291.    FDragOffset := 0;
  292.    ThumbStyle := tsRect;
  293.    GrooveStyle := gsRect;
  294.    FFocusColor := clActiveCaption;
  295.    FGrooveColor := clBtnFace;
  296.    FThumbColor := clBtnFace;
  297.    FThumbBorder:= True;
  298.    FDisabledColor := clWhite;
  299.    FScalePos := spBelowOrRight;
  300.    FScale := TMMScale.Create;
  301.    FScale.OnChange  := ScaleChanged;
  302.    FScale.Visible := False;
  303.    FScale.Origin := soOuter;
  304.    FScale.Connect := True;
  305.    FScaleDistance := 10;
  306.    FFocusTime := False;
  307.    FSensitivity := -24;
  308.    FLogMode := False;
  309.    FNeedTrackEnd := False;
  310.    TabStop := True;
  311.    FThumbWidth := 11;
  312.    ThumbHeight := 23;
  313.    FPicLeft := TBitmap.Create;
  314.    FPicRight := TBitmap.Create;
  315.    FPicLeft.OnChange := PicChanged;
  316.    FPicRight.OnChange := PicChanged;
  317.    ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  318.    if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  319. end;
  320. {-- TMMCustomSlider -----------------------------------------------------}
  321. destructor TMMCustomSlider.Destroy;
  322. begin
  323.    FGroove.OnChange := Nil;
  324.    FGroove.Free;
  325.    RemoveCacheBitmap(FBitmap);
  326.    UpdateFocusTimer(False);
  327.    FScale.Free;
  328.    FPicLeft.Free;
  329.    FPicRight.Free;
  330.    inherited Destroy;
  331. end;
  332. {-- TMMCustomSlider -----------------------------------------------------}
  333. procedure TMMCustomSlider.Change;
  334. begin
  335.    if (csLoading in ComponentState) or
  336.       (csReading in ComponentState) then exit;
  337.    if assigned(FOnChange) then FOnChange(Self);
  338. end;
  339. {-- TMMCustomSlider -----------------------------------------------------}
  340. procedure TMMCustomSlider.Track;
  341. begin
  342.    FNeedTrackEnd := True;
  343.    if assigned(FOnTrack) then FOnTrack(Self);
  344. end;
  345. {-- TMMCustomSlider -----------------------------------------------------}
  346. procedure TMMCustomSlider.TrackEnd;
  347. begin
  348.    if FNeedTrackEnd then
  349.    begin
  350.       if assigned(FOnTrackEnd) then FOnTrackEnd(Self);
  351.       FNeedTrackEnd := False;
  352.    end;
  353. end;
  354. {-- TMMCustomSlider -----------------------------------------------------}
  355. procedure TMMCustomSlider.OwnerDrawThumb(aCanvas: TCanvas; aRect: TRect; Dragged,Focused: Boolean);
  356. begin
  357.    if assigned(FOnDrawThumb) then FOnDrawThumb(Self,aCanvas,aRect,Dragged,Focused);
  358. end;
  359. {-- TMMCustomSlider -----------------------------------------------------}
  360. procedure TMMCustomSlider.OwnerDrawGroove(aCanvas: TCanvas; var aRect: TRect);
  361. begin
  362.    if Assigned(FOnDrawGroove) then FOnDrawGroove(Self,aCanvas,aRect);
  363. end;
  364. {-- TMMCustomSlider -----------------------------------------------------}
  365. Procedure TMMCustomSlider.SetGroove(aValue: TMMBevel);
  366. begin
  367.    FGroove.Assign(aValue);
  368. end;
  369. {-- TMMCustomSlider -----------------------------------------------------}
  370. procedure TMMCustomSlider.GrooveChanged(Sender: TObject);
  371. begin
  372.    Changed;
  373. end;
  374. {-- TMMCustomSlider -----------------------------------------------------}
  375. procedure TMMCustomSlider.ScaleChanged(Sender: TObject);
  376. begin
  377.    Changed;
  378. end;
  379. {-- TMMCustomSlider -----------------------------------------------------}
  380. procedure TMMCustomSlider.PicChanged(Sender: TObject);
  381. begin
  382.    Changed;
  383. end;
  384. {-- TMMCustomSlider -----------------------------------------------------}
  385. function  TMMCustomSlider.CalcClientRect: TRect;
  386. begin
  387.     Result := BeveledRect;
  388.     if not FPicLeft.Empty then
  389.         if Orientation = orHorizontal then
  390.             Inc(Result.Left,FPicLeft.Width)
  391.         else
  392.             Inc(Result.Top,FPicLeft.Height);
  393.     if not FPicRight.Empty then
  394.         if Orientation = orHorizontal then
  395.             Dec(Result.Right,FPicRight.Width)
  396.         else
  397.             Dec(Result.Bottom,FPicRight.Height);
  398. end;
  399. {-- TMMCustomSlider -----------------------------------------------------}
  400. procedure TMMCustomSlider.WMSetFocus(var Message: TWMSetFocus);
  401. begin
  402.    inherited;
  403.    { Added January, 30 2000 }
  404.    if Assigned(FOnGetFocus) then FOnGetFocus(Self);
  405.    if (FFocusAction <> faNone) then
  406.    begin
  407.       UpdateFocusTimer(True);
  408.       Refresh;
  409.    end;
  410. end;
  411. {-- TMMCustomSlider -----------------------------------------------------}
  412. procedure TMMCustomSlider.WMKillFocus(var Message: TWMKillFocus);
  413. begin
  414.    inherited;
  415.    { Added January, 30 2000 }
  416.    if Assigned(FOnLostFocus) then FOnLostFocus(Self);
  417.    if (FFocusAction <> faNone) then
  418.    begin
  419.       UpdateFocusTimer(False);
  420.       Refresh;
  421.    end;
  422. end;
  423. {-- TMMCustomSlider -----------------------------------------------------}
  424. procedure TMMCustomSlider.WMGetDlgCode(var Message: TWMGetDlgCode);
  425. begin
  426.   Message.Result := DLGC_WANTARROWS;
  427. end;
  428. {-- TMMCustomSlider -----------------------------------------------------}
  429. procedure TMMCustomSlider.CMEnabledChanged(var Message: TMessage);
  430. begin
  431.    inherited;
  432.    Refresh;
  433. end;
  434. {-- TMMCustomSlider -----------------------------------------------------}
  435. procedure TMMCustomSlider.WMSize(var Message: TWMSize);
  436. begin
  437.    if Height > Width then
  438.       Orientation := orVertical else Orientation := orHorizontal;
  439. end;
  440. {-- TMMCustomSlider -----------------------------------------------------}
  441. procedure TMMCustomSlider.Loaded;
  442. begin
  443.    inherited Loaded;
  444.    UpdateBitmap(Width,Height);
  445. end;
  446. {-- TMMCustomSlider -----------------------------------------------------}
  447. procedure TMMCustomSlider.UpdateBitmap(aWidth,aHeight: integer);
  448. begin
  449.    if (csLoading in ComponentState) or
  450.       (csReading in ComponentState) then exit;
  451.    RemoveCacheBitmap(FBitmap);
  452.    FBitmap := LoadCacheBitmap(Max(aWidth,0),Max(aHeight,0));
  453.    Invalidate;
  454. end;
  455. {-- TMMCustomSlider -----------------------------------------------------}
  456. procedure TMMCustomSlider.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
  457. begin
  458.    if (Width <> aWidth) or (Height <> aHeight) or (FBitmap = nil) then
  459.    begin
  460.       UpdateBitmap(aWidth,aHeight);
  461.    end;
  462.    inherited SetBounds(aLeft, aTop, aWidth, aHeight);
  463. end;
  464. {-- TMMCustomSlider -----------------------------------------------------}
  465. procedure TMMCustomSlider.SetColors(index: integer; aValue: TColor);
  466. begin
  467.    case index of
  468.       0: if aValue = FFocusColor then exit else FFocusColor := aValue;
  469.       1: if aValue = FGrooveColor then exit else FGrooveColor := aValue;
  470.       2: if aValue = FThumbColor then exit else FThumbColor := aValue;
  471.       3: if aValue = FDisabledColor then exit else FDisabledColor := aValue;
  472.    end;
  473.    Refresh;
  474.    {$IFDEF WIN32}
  475.    {$IFDEF TRIAL}
  476.    {$DEFINE _HACK1}
  477.    {$I MMHACK.INC}
  478.    {$ENDIF}
  479.    {$ENDIF}
  480. end;
  481. {-- TMMCustomSlider -----------------------------------------------------}
  482. procedure TMMCustomSlider.SetThumbBorder(aValue: Boolean);
  483. begin
  484.    if (aValue <> FThumbBorder) then
  485.    begin
  486.       FThumbBorder := aValue;
  487.       Invalidate;
  488.    end;
  489. end;
  490. {-- TMMCustomSlider -----------------------------------------------------}
  491. procedure TMMCustomSlider.SetThumbSize(index: integer; aValue: Byte);
  492. begin
  493.    case Index of
  494.        0: if (aValue = FThumbWidth) then exit else FThumbWidth := aValue;
  495.        1: if (aValue = FThumbHeight) then exit else FThumbHeight := aValue;
  496.    end;
  497.    HalfTH := FThumbHeight div 2;
  498.    HalfTW := FThumbWidth div 2;
  499.    Refresh;
  500.    {$IFDEF WIN32}
  501.    {$IFDEF TRIAL}
  502.    {$DEFINE _HACK2}
  503.    {$I MMHACK.INC}
  504.    {$ENDIF}
  505.    {$ENDIF}
  506. end;
  507. {-- TMMCustomSlider -----------------------------------------------------}
  508. procedure TMMCustomSlider.SetThumbStyle(aValue: TMMThumbStyle);
  509. begin
  510.    if (FThumbStyle <> aValue) then
  511.    begin
  512.       FThumbStyle := aValue;
  513.       Refresh;
  514.    end;
  515. end;
  516. {-- TMMCustomSlider -----------------------------------------------------}
  517. procedure TMMCustomSlider.SetGrooveStyle(aValue: TMMGrooveStyle);
  518. begin
  519.    if (FGrooveStyle <> aValue) then
  520.    begin
  521.       FGrooveStyle := aValue;
  522.       Refresh;
  523.    end;
  524. end;
  525. {-- TMMCustomSlider -----------------------------------------------------}
  526. procedure TMMCustomSlider.SetSensitivity(aValue: integer);
  527. var
  528.    oldVal: integer;
  529. begin
  530.    aValue:= MinMax(aValue, -96, -20);
  531.    if aValue <> FSensitivity then
  532.    begin
  533.       oldVal := Position;
  534.       FSensitivity:= aValue;
  535.       Position := oldVal;
  536.    end;
  537. end;
  538. {-- TMMCustomSlider -----------------------------------------------------}
  539. procedure TMMCustomSlider.SetLogMode;
  540. var
  541.    oldVal: integer;
  542. begin
  543.    if (aValue <> FlogMode) then
  544.    begin
  545.       oldVal := Position;
  546.       FLogMode := aValue;
  547.       Position := oldVal;
  548.    end;
  549. end;
  550. {-- TMMCustomSlider -----------------------------------------------------}
  551. procedure TMMCustomSlider.SetMin(aValue: Longint);
  552. begin
  553.    SetMinMax(aValue,FMax);
  554. end;
  555. {-- TMMCustomSlider -----------------------------------------------------}
  556. procedure TMMCustomSlider.SetMax(aValue: Longint);
  557. begin
  558.    SetMinMax(FMin,aValue);
  559. end;
  560. {-- TMMCustomSlider -----------------------------------------------------}
  561. procedure TMMCustomSlider.SetMinMax(aMin,aMax: Longint);
  562. begin
  563.    if (Fmin <> aMin) or (FMax <> aMax) then
  564.    begin
  565.       FMin := aMin;
  566.       FMax := aMax;
  567.       if not (csLoading in ComponentState) then
  568.          FMax := Max(FMax,FMin+1);
  569.       FForceChange := True;
  570.       Position := MinMax(Position,FMin,FMax);
  571.       FForceChange := False;
  572.       Refresh;
  573.    end;
  574. end;
  575. {-- TMMCustomSlider -----------------------------------------------------}
  576. procedure TMMCustomSlider.SetOrientation(aValue: TMMOrientation);
  577. var
  578.    Temp: integer;
  579. begin
  580.    if (aValue <> FOrientation) then
  581.    begin
  582.       FOrientation := aValue;
  583.       if (csDesigning in ComponentState) and
  584.          not (csLoading in ComponentState) and
  585.          not (csReading in ComponentState) then
  586.       begin
  587.          { exchange Thumb sizes }
  588.          Temp := ThumbWidth;
  589.          ThumbWidth := ThumbHeight;
  590.          ThumbHeight := Temp;
  591.          if (isVert and (Width > Height)) or
  592.             (not isVert and (Height > Width)) then
  593.             SetBounds(Left,Top,Height,Width);
  594.       end;
  595.       Refresh;
  596.    end;
  597.    {$IFDEF WIN32}
  598.    {$IFDEF TRIAL}
  599.    {$DEFINE _HACK2}
  600.    {$I MMHACK.INC}
  601.    {$ENDIF}
  602.    {$ENDIF}
  603. end;
  604. {-- TMMCustomSlider -----------------------------------------------------}
  605. function TMMCustomSlider.UpdatePosition(aValue: Longint): Boolean;
  606. var
  607.    aRect: TRect;
  608. begin
  609.    if (aValue <> FPosition) or FForceChange then
  610.    begin
  611.       Result := True;
  612.       FPosition := MinMax(aValue,FMin,FMax);
  613.       if not (csDesigning in ComponentState) and
  614.          not (csLoading in ComponentState) then
  615.       begin
  616.          WhereIsThumb(CalcClientRect,aRect);
  617.          if (aRect.Left <> FThumbRect.Left) or (aRect.Top <> FThumbRect.Top) or
  618.             (aRect.Right <> FThumbRect.Right) or (aRect.Bottom <> FThumbRect.Bottom) then
  619.          begin
  620.             Refresh;
  621.          end;
  622.          Change;
  623.       end
  624.       else Refresh;
  625.    end
  626.    else Result := False;
  627. end;
  628. {-- TMMCustomSlider -----------------------------------------------------}
  629. procedure TMMCustomSlider.SetPosition(aValue: Longint);
  630. var
  631.    aPos: Float;
  632. begin
  633.    if FLogMode and (aValue <> 0) then
  634.    begin
  635.       aPos:= Log10(aValue/(FMax-FMin))*20 + -FSensitivity;
  636.       aPos:= MinMax(Round(aPos*(FMax-FMin)/-FSensitivity),FMin,FMax);
  637.       aValue := Round(aPos);
  638.    end;
  639.    UpdatePosition(aValue);
  640. end;
  641. {-- TMMCustomSlider -----------------------------------------------------}
  642. function TMMCustomSlider.GetPosition: Longint;
  643. var
  644.    aPos: Float;
  645. begin
  646.    aPos := MinMax(FPosition,FMin,FMax);
  647.    if FLogMode and (aPos <> 0) then
  648.    begin
  649.       aPos:= Pow(10,(aPos*(-FSensitivity)/(FMax-FMin)-(-FSensitivity))/20)*(FMax-FMin);
  650.    end;
  651.    Result := MinMax(Round(aPos),FMin,FMax);
  652. end;
  653. {-- TMMCustomSlider -----------------------------------------------------}
  654. procedure TMMCustomSlider.SetGrooveSize(aValue: Byte);
  655. begin
  656.    If (aValue >= 0) then
  657.    begin
  658.       FGrooveSize := aValue;
  659.       Refresh;
  660.    end;
  661. end;
  662. {-- TMMCustomSlider -----------------------------------------------------}
  663. procedure TMMCustomSlider.SetScaleDist(aValue: Integer);
  664. begin
  665.   if (aValue <> FScaleDistance) then
  666.   begin
  667.      FScaleDistance := aValue;
  668.      Refresh;
  669.   end;
  670. end;
  671. {-- TMMCustomSlider -----------------------------------------------------}
  672. procedure TMMCustomSlider.SetScalePos(aValue: TMMScalePos);
  673. begin
  674.    if (aValue <> FScalePos) then
  675.    begin
  676.       FScalePos := aValue;
  677.       Refresh;
  678.    end;
  679. end;
  680. {-- TMMCustomSlider -----------------------------------------------------}
  681. procedure TMMCustomSlider.SetScale(Value: TMMScale);
  682. begin
  683.     FScale.Assign(Value);
  684. end;
  685. {-- TMMCustomSlider -----------------------------------------------------}
  686. procedure TMMCustomSlider.TimerAction(Sender: TObject);
  687. begin
  688.    if not FDragging then
  689.    begin
  690.       FFocusTime := not FFocusTime;
  691.       Refresh;
  692.    end
  693.    else FFocusTime := True;
  694. end;
  695. {-- TMMCustomSlider -----------------------------------------------------}
  696. procedure TMMCustomSlider.UpdateFocusTimer(Enable: Boolean);
  697. begin
  698.    if (FocusTimer <> nil) and (FocusTimer.Owner = Self) then
  699.    begin
  700.       FocusTimer.Enabled := False;
  701.       FocusTimer.Free;
  702.       FocusTimer :=  nil;
  703.       FFocusTime := False;
  704.    end;
  705.    if not (csDesigning in ComponentState) then
  706.    begin
  707.       if Enable and Focused and (FocusAction in [faFocusThumb,faAll]) then
  708.       begin
  709.          if (FocusTimer = nil) then FocusTimer := TTimer.Create(Self);
  710.          FocusTimer.OnTimer := TimerAction;
  711.          FocusTimer.Interval := 500;
  712.          FocusTimer.Enabled := True;
  713.       end;
  714.    end;
  715. end;
  716. {-- TMMCustomSlider -----------------------------------------------------}
  717. procedure TMMCustomSlider.SetFocusAction(aValue: TMMFocusAction);
  718. begin
  719.   if (FFocusAction <> aValue) then
  720.   begin
  721.      FFocusAction := aValue;
  722.      UpdateFocusTimer(Enabled);
  723.      Refresh;
  724.   end;
  725. end;
  726. {-- TMMCustomSlider -----------------------------------------------------}
  727. function TMMCustomSlider.NewPosition(WhereX,WhereY: Integer): integer;
  728. var
  729.   aHeight,aWidth: Integer;
  730. begin
  731.    { Calculate the nearest position to where the mouse is located }
  732.    with CalcClientRect do
  733.    begin
  734.       aHeight := Bottom - Top - FThumbHeight;
  735.       aWidth  := Right - Left -FThumbWidth;
  736.       WhereY  := WhereY - Top - HalfTH;
  737.       WhereX  := WhereX - Left - HalfTW;
  738.    end;
  739.    if IsVert then
  740.       Result := Round(((aHeight-WhereY)/aHeight)*(FMax-FMin)+FMin)
  741.    else
  742.       Result := Round((WhereX/aWidth)*(FMax-FMin)+FMin);
  743.    Result := Min(Max(Result,FMin),FMax);
  744. end;
  745. {-- TMMCustomSlider -----------------------------------------------------}
  746. function TMMCustomSlider.IsVert: Boolean;
  747. begin
  748.    IsVert := (Orientation = orVertical);
  749. end;
  750. {-- TMMCustomSlider -----------------------------------------------------}
  751. procedure TMMCustomSlider.KeyDown(var Key: Word; Shift: TShiftState);
  752. var
  753.   Pos : Integer;
  754. begin
  755.    Pos := FPosition; { To avoid compiler warning }
  756.    try
  757.       case Key of
  758.          VK_NEXT : if (FPosition-FPageSize) > FMin then
  759.                        Pos := FPosition - FPageSize else Pos := FMin;
  760.          VK_PRIOR: if (FPosition+FPageSize) < FMax then
  761.                        Pos := FPosition + FPageSize else Pos := FMax;
  762.          VK_END  : if IsVert then Pos := FMin else Pos := FMax;
  763.          VK_HOME : if IsVert then Pos := FMax else Pos := FMin;
  764.          VK_LEFT,
  765.          VK_DOWN : if FPosition > FMin then Pos := FPosition - FLineSize;
  766.          VK_UP,
  767.          VK_RIGHT: if FPosition < FMax then Pos := FPosition + FLineSize;
  768.         else exit;
  769.       end;
  770.       if UpdatePosition(Pos) then Track;
  771.    finally
  772.       inherited KeyDown(Key,Shift);
  773.    end;
  774. end;
  775. {-- TMMCustomSlider -----------------------------------------------------}
  776. procedure TMMCustomSlider.KeyUp(var Key: Word; Shift: TShiftState);
  777. begin
  778.    TrackEnd;
  779.    inherited KeyUp(Key,Shift);
  780. end;
  781. {-- TMMCustomSlider -----------------------------------------------------}
  782. procedure TMMCustomSlider.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  783. begin
  784. {$IFNDEF BUILD_ACTIVEX}
  785.    SetFocus;
  786. {$ELSE}
  787.    Windows.SetFocus(Handle);
  788. {$ENDIF}
  789.    if PtInRect(FThumbRect,Point(X,Y)) then
  790.    begin
  791.       if (Button = mbLeft) then FDragging := True;
  792.       SetThumbCursor(True);
  793.    end;
  794.    if (Button = mbLeft) then
  795.    begin
  796.       if IsVert then
  797.          FDragOffset := Y
  798.       else
  799.          FDragOffset := X;
  800.       FDragVal := FPosition;
  801.       if not FDragging then
  802.       begin
  803.          if not UpdatePosition(NewPosition(X,Y)) then
  804.             Invalidate;
  805.       end
  806.       else Invalidate;
  807.       Track;
  808.    end;
  809.    inherited MouseDown(Button, Shift, X, Y);
  810. end;
  811. {-- TMMCustomSlider -----------------------------------------------------}
  812. procedure TMMCustomSlider.MouseMove(Shift: TShiftState; X, Y: Integer);
  813. var
  814.    aPos,aWidth,aHeight: integer;
  815. begin
  816.    if not FDragging then
  817.    begin
  818.      {$IFDEF WIN32}
  819.      SetThumbCursor(ptInRect(FThumbRect,Point(X,Y)));
  820.      {$ELSE}
  821.      SetThumbCursor(ptInRect(FThumbRect,Point(X,Y)) or FDragging);
  822.      {$ENDIF}
  823.    end;
  824.    {Is the left mouse button down and dragging the thumb bar?}
  825.    if (ssLeft in Shift) and FDragging then
  826.    begin
  827.       with CalcClientRect do
  828.       begin
  829.          aHeight := Bottom - Top - FThumbHeight;
  830.          aWidth  := Right - Left - FThumbWidth;
  831.       end;
  832.       if IsVert then
  833.          aPos := MulDiv(FDragOffset-Y,FMax-FMin,aHeight)
  834.       else
  835.          aPos := MulDiv(X-FDragOffset,FMax-FMin,aWidth);
  836.       aPos := Min(Max(FDragVal+aPos,FMin),FMax);
  837.       if UpdatePosition(aPos) then Track;
  838.    end;
  839.    inherited MouseMove(Shift, X, Y);
  840. end;
  841. {-- TMMCustomSlider -----------------------------------------------------}
  842. procedure TMMCustomSlider.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  843. begin
  844.    if (Button = mbLeft) then
  845.    begin
  846.       FDragging := False;
  847.       Refresh;
  848.       TrackEnd;
  849.    end;
  850.    inherited MouseUp(Button, Shift, X, Y);
  851. end;
  852. {-- TMMCustomSlider -----------------------------------------------------}
  853. procedure TMMCustomSlider.WhereIsThumb(const ClientRect: TRect; var aRect: Trect);
  854. var
  855.   Each              : Real;
  856.   ThumbX,ThumbY     : Integer;
  857.   AWidth, AHeight   : Integer ;
  858. begin
  859.    AWidth := ClientRect.Right - ClientRect.Left ;
  860.    AHeight := ClientRect.Bottom - ClientRect.Top ;
  861.    { Calculate where to paint the thumb bar - store in aRect }
  862.    if IsVert then
  863.    begin
  864.       Each   := (AHeight-FThumbHeight)/(FMax-FMin);
  865.       ThumbY := AHeight-Round(Each*(FPosition-FMin))-FThumbHeight;
  866.       ThumbY := ClientRect.Top + Max(0,Min(AHeight-FThumbHeight,ThumbY));
  867.       if Scale.Visible and (FScalePos = spBelowOrRight) then
  868.          ThumbX := ClientRect.Left
  869.       else if Scale.Visible and (FScalePos = spAboveOrLeft) then
  870.          ThumbX := ClientRect.Left + AWidth-ThumbWidth
  871.       else
  872.          ThumbX := ClientRect.Left + AWidth div 2 - HalfTW;
  873.    end
  874.    else
  875.    begin
  876.       Each := (AWidth-FThumbWidth)/(FMax-FMin);
  877.       ThumbX := Round(Each*(FPosition-FMin));
  878.       ThumbX := ClientRect.Left + Max(0,Min(AWidth-FThumbWidth,ThumbX));
  879.       if Scale.Visible and (FScalePos = spBelowOrRight) then
  880.          ThumbY := ClientRect.Top
  881.       else if Scale.Visible and (FScalePos = spAboveOrLeft) then
  882.          ThumbY := ClientRect.Top + AHeight-ThumbHeight
  883.       else
  884.          ThumbY := ClientRect.Top + AHeight div 2 - HalfTH;
  885.    end;
  886.    aRect := Rect(ThumbX,ThumbY,ThumbX+FThumbWidth,ThumbY+FThumbHeight);
  887. end;
  888. {-- TMMCustomSlider -----------------------------------------------------}
  889. procedure TMMCustomSlider.DrawScale(Canvas: TCanvas; aRect: TRect);
  890. begin
  891.    if Scale.Visible then
  892.    with Scale do
  893.    begin
  894.       MinValue := Self.MinValue;
  895.       MaxValue := Self.MaxValue;
  896.    end
  897.    else Exit;
  898.    Scale.Canvas := Canvas;
  899.    if isVert then
  900.    begin
  901.       Inc(aRect.Top, HalfTH);
  902.       Dec(aRect.Bottom, HalfTH);
  903.       if (FScalePos = spAboveOrLeft) or (FScalePos = spBoth) then
  904.           Scale.DrawRect(Canvas,Rect(aRect.Left-Scale.ScaleHeight-FScaleDistance,
  905.                          aRect.Top,aRect.Left-FScaleDistance,aRect.Bottom),True);
  906.       if (FScalePos = spBelowOrRight) or (FScalePos = spBoth) then
  907.           Scale.DrawRect(Canvas,Rect(aRect.Right+FScaleDistance,
  908.                          aRect.Top,aRect.Right+Scale.ScaleHeight+FScaleDistance,
  909.                          aRect.Bottom),False);
  910.    end
  911.    else
  912.    begin
  913.       Inc(aRect.Left, HalfTW);
  914.       Dec(aRect.Right, HalfTW);
  915.       if (FScalePos = spAboveOrLeft) or (FScalePos = spBoth) then
  916.           Scale.DrawRect(Canvas,Rect(aRect.Left,aRect.Top-Scale.ScaleHeight-FScaleDistance-1,
  917.                          aRect.Right,aRect.Top-FScaleDistance-1),True);
  918.       if (FScalePos = spBelowOrRight) or (FScalePos = spBoth) then
  919.           Scale.DrawRect(Canvas,Rect(aRect.Left,aRect.Bottom+FScaleDistance+1,
  920.                          aRect.Right,aRect.Bottom+Scale.ScaleHeight+FScaleDistance+1),False);
  921.    end;
  922. end;
  923. {-- TMMCustomSlider -----------------------------------------------------}
  924. procedure TMMCustomSlider.DrawTrench(Canvas: TCanvas; aRect: TRect);
  925. var
  926.   aWidth,aHeight: integer;
  927.   X1,Y1,X2,Y2   : integer;
  928.   R1,R2,R3      : TRect;
  929. begin
  930.    {This procedure simply draws the slot that the thumb bar will travel through}
  931.    {including the tick-marks. The bar itself is not drawn.}
  932.    {Calculate the corners of the trench dependant on orientation}
  933.    aWidth := aRect.Right-aRect.Left;
  934.    aHeight:= aRect.Bottom-aRect.Top;
  935.    with Canvas do
  936.    begin
  937.       if IsVert then
  938.       begin
  939.          if Scale.Visible and (FScalePos = spBelowOrRight) then
  940.             X1 := aRect.Left+HalfTW-FGroove.BevelExtend -(FGrooveSize div 2)
  941.          else if Scale.Visible and (FScalePos = spAboveOrLeft) then
  942.             X1 := aRect.Right-HalfTW-FGroove.BevelExtend-(FGrooveSize div 2)-1
  943.          else
  944.             X1 := aRect.Left+(aWidth div 2) - FGroove.BevelExtend -(FGrooveSize div 2);
  945.          X2 := X1 + 2*FGroove.BevelExtend + FGrooveSize;
  946.          Y1 := aRect.Top;
  947.          Y2 := aRect.Bottom;
  948.       end
  949.       else
  950.       begin
  951.          if Scale.Visible and (FScalePos = spBelowOrRight) then
  952.             Y1 := aRect.Top+HalfTH-FGroove.BevelExtend -(FGrooveSize div 2)
  953.          else if Scale.Visible and (FScalePos = spAboveOrLeft) then
  954.             Y1 := aRect.Bottom-HalfTH-FGroove.BevelExtend-(FGrooveSize div 2)-1
  955.          else
  956.             Y1 := aRect.Top+(aHeight div 2)-FGroove.BevelExtend-(FGrooveSize div 2);
  957.          Y2 := Y1 + 2*FGroove.BevelExtend+ FGrooveSize;
  958.          X1 := aRect.Left;
  959.          X2 := aRect.Right;
  960.       end;
  961.       R1 := Rect(X1,Y1,X2,Y2);
  962.       DrawScale(Canvas,R1);
  963.       R2 := DrawGroove(Canvas,R1);
  964.       {Now do a filled rectangle in the center if the control has focus}
  965.       Brush.Color := FGrooveColor;
  966.       if Focused then
  967.       begin
  968.          if (FFocusAction = faFocusRect) or (FFocusAction = faAll) then
  969.          begin
  970.             R3 := aRect;
  971.             if ((Bevel.BorderWidth > 0) and (Bevel.BevelInner = bvNone)) or
  972.                (Bevel.BorderSpace > 0) then
  973.                InflateRect(R3,1,1);
  974.             DrawFocusRect(R3);
  975.          end;
  976.          if (FFocusAction = faFocusColor) or (FFocusAction = faAll) then
  977.              Brush.Color := FocusColor;
  978.       end;
  979.       FillRect(R2);
  980.    end;
  981. end;
  982. {-- TMMCustomSlider -----------------------------------------------------}
  983. procedure TMMCustomSlider.DrawThumb(Canvas: TCanvas; aRect: Trect);
  984. var
  985.    X, Y: integer;
  986.    Clr: TColor;
  987. begin
  988.    with Canvas,aRect do
  989.    begin
  990.       case FThumbStyle of
  991.         tsOwnerDraw: OwnerDrawThumb(Canvas, aRect, FDragging, FFocusTime);
  992.         tsRect:
  993.         begin
  994.            if FThumbBorder then
  995.               Frame3D(Canvas, aRect, clWindowFrame, clWindowFrame, 1)
  996.            else
  997.            begin
  998.               Pen.Color := clWindowFrame;
  999.               MoveTo(aRect.Left,aRect.Bottom-1);
  1000.               LineTo(aRect.Right-1,aRect.Bottom-1);
  1001.               LineTo(aRect.Right-1,aRect.Top-1);
  1002.               dec(aRect.Right);
  1003.               dec(aRect.Bottom);
  1004.            end;
  1005.            Frame3D(Canvas, aRect, clBtnHighlight, clBtnShadow, 1);
  1006.            Pixels[aRect.Right,aRect.Top-1] := clBtnHighLight;
  1007.            Pixels[aRect.Left-1,aRect.Bottom] := clBtnHighLight;
  1008.            Brush.Color := FThumbColor;
  1009.            FillRect(aRect);
  1010.            if not Enabled or FFocusTime then
  1011.            begin
  1012.               if not Enabled then
  1013.                  Clr := FDisabledColor
  1014.               else
  1015.                  Clr := clBlack;
  1016.               for Y := aRect.Top to aRect.Bottom-1 do
  1017.                   for X := aRect.Left to aRect.Right-1 do
  1018.                   if (Y mod 2) = (X mod 2) then
  1019.                      Pixels[X, Y] := Clr;
  1020.            end;
  1021.         end;
  1022.       end;
  1023.    end;
  1024. end;
  1025. {-- TMMCustomSlider -----------------------------------------------------}
  1026. function  TMMCustomSlider.DrawPics(Canvas: TCanvas; aRect: TRect): TRect;
  1027. var
  1028.     AWidth, AHeight: Integer;
  1029.     OrigX, OrigY   : Integer;
  1030.     procedure   DrawPic(Pic: TBitmap; R: TRect);
  1031.     var
  1032.         X, Y: Integer;
  1033.     begin
  1034.         X := R.Left + (R.Right - R.Left - Pic.Width) div 2;
  1035.         Y := R.Top + (R.Bottom - R.Top - Pic.Height) div 2;
  1036.         Canvas.BrushCopy(Bounds(X,Y,Pic.Width,Pic.Height),Pic,Bounds(0,0,Pic.Width,Pic.Height),Pic.TransparentColor);
  1037.     end;
  1038. begin
  1039.     AWidth := aRect.Right - aRect.Left;
  1040.     AHeight:= aRect.Bottom- aRect.Top;
  1041.     OrigY := AHeight div 2 + aRect.Top;
  1042.     if Orientation = orHorizontal then
  1043.         if Scale.Visible then
  1044.             if ScalePosition = spAboveOrLeft then
  1045.                 OrigY := aRect.Bottom - FThumbHeight div 2
  1046.             else if ScalePosition = spBelowOrRight then
  1047.                 OrigY := aRect.Top + FThumbHeight div 2;
  1048.   
  1049.     OrigX := AWidth div 2 + aRect.Left;
  1050.     if Orientation = orVertical then
  1051.         if Scale.Visible then
  1052.             if ScalePosition = spAboveOrLeft then
  1053.                 OrigX := aRect.Right - FThumbWidth div 2
  1054.             else if ScalePosition = spBelowOrRight then
  1055.                 OrigX := aRect.Left + FThumbWidth div 2;
  1056.     if not FPicLeft.Empty then
  1057.         if Orientation = orHorizontal then
  1058.         begin
  1059.           DrawPic(FPicLeft,Bounds(aRect.Left,OrigY-FPicLeft.Height div 2,FPicLeft.Width,FPicLeft.Height));
  1060.           Inc(aRect.Left,FPicLeft.Width);
  1061.         end
  1062.         else
  1063.         begin
  1064.            DrawPic(FPicLeft,Bounds(OrigX-FPicLeft.Width div 2,aRect.Top,FPicLeft.Width,FPicLeft.Height));
  1065.            Inc(aRect.Top,FPicLeft.Height);
  1066.         end;
  1067.     if not FPicRight.Empty then
  1068.         if Orientation = orHorizontal then
  1069.         begin
  1070.            DrawPic(FPicRight,Bounds(aRect.Right-FPicRight.Width,OrigY-FPicRight.Height div 2,
  1071.                    FPicRight.Width,FPicRight.Height));
  1072.            Dec(aRect.Right,FPicRight.Width);
  1073.         end
  1074.         else
  1075.         begin
  1076.            DrawPic(FPicRight,Bounds(OrigX-FPicRight.Width div 2,aRect.Bottom-FPicRight.Height,
  1077.                    FPicRight.Width,FPicRight.Height));
  1078.            Dec(aRect.Bottom,FPicRight.Height);
  1079.         end;
  1080.     Result := aRect;
  1081. end;
  1082. {-- TMMCustomSlider -----------------------------------------------------}
  1083. procedure TMMCustomSlider.SetPicLeft(Value: TBitmap);
  1084. begin
  1085.    FPicLeft.Assign(Value);
  1086. end;
  1087. {-- TMMCustomSlider -----------------------------------------------------}
  1088. procedure TMMCustomSlider.SetPicRight(Value: TBitmap);
  1089. begin
  1090.    FPicRight.Assign(Value);
  1091. end;
  1092. {-- TMMCustomSlider -----------------------------------------------------}
  1093. procedure TMMCustomSlider.Paint;
  1094. var
  1095.    aRect: TRect;
  1096. begin
  1097.    if (FBitmap = nil) then exit;
  1098.    with FBitmap do
  1099.    begin
  1100.       { draw the Bevel and fill the area }
  1101.       aRect := Bevel.PaintBevel(Canvas, ClientRect,True);
  1102.       with FBitmap.Canvas do
  1103.       begin
  1104.          Brush.Color := Color;
  1105.          Brush.Style := bsSolid;
  1106.          FillRect(aRect);
  1107.          aRect := DrawPics(Canvas,aRect);
  1108.          WhereIsThumb(aRect,FThumbRect);
  1109.          DrawTrench(Canvas, aRect);
  1110.          DrawThumb(Canvas, FThumbRect);
  1111.      
  1112.       end;
  1113.    end;
  1114.    Canvas.Draw(0,0,FBitmap); 
  1115. end;
  1116. {-- TMMCustomSlider -----------------------------------------------------}
  1117. function TMMCustomSlider.DrawGroove(Canvas: TCanvas; aRect: TRect): TRect;
  1118. begin
  1119.    if FGrooveStyle = gsOwnerDraw then
  1120.    begin
  1121.       InflateRect(aRect,0,-FGroove.BevelExtend);
  1122.       OwnerDrawGroove(Canvas,aRect);
  1123.       Result := aRect;
  1124.    end
  1125.    else
  1126.       Result := FGroove.PaintBevel(Canvas, aRect, True);
  1127. end;
  1128. {-- TMMCustomSlider -----------------------------------------------------}
  1129. procedure TMMCustomSlider.SetThumbCursor(AtThumb: Boolean);
  1130. begin
  1131.    if AtThumb then
  1132.       if FHandCursor then
  1133.          SetCursor(Screen.Cursors[crsHand5])
  1134.       else
  1135.          SetCursor(Screen.Cursors[ThumbCursor])
  1136.    else
  1137.        SetCursor(Screen.Cursors[Cursor]);
  1138. end;
  1139. {-- TMMCustomSlider -----------------------------------------------------}
  1140. procedure TMMCustomSlider.CMMouseEnter(var msg: TMessage);
  1141. begin
  1142.    if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  1143. end;
  1144. {-- TMMCustomSlider -----------------------------------------------------}
  1145. procedure TMMCustomSlider.CMMouseLeave(var msg: TMessage);
  1146. begin
  1147.    if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
  1148. end;
  1149. end.