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

Delphi控件源码

开发平台:

Delphi

  1. {*****************************************************}
  2. {                                                     }
  3. {     Varian Component Workshop                       }
  4. {                                                     }
  5. {     Varian Software NL (c) 1996-2000                }
  6. {     All Rights Reserved                             }
  7. {                                                     }
  8. {*****************************************************}
  9. unit VrSwitch;
  10. {$I VRLIB.INC}
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   VrConst, VrTypes, VrClasses, VrControls, VrSysUtils, VrSystem;
  15. type
  16.   TVrSwitchOption = (soActiveClick, soMouseClip, soHandPoint, soThumbOpaque);
  17.   TVrSwitchOptions = set of TVrSwitchOption;
  18.   TVrSwitch = class(TVrCustomImageControl)
  19.   private
  20.     FOffset: Integer;
  21.     FPositions: Integer;
  22.     FOrientation: TVrOrientation;
  23.     FBevel: TVrBevel;
  24.     FStyle: TVrProgressStyle;
  25.     FOptions: TVrSwitchOptions;
  26.     FBorderColor: TColor;
  27.     FBorderWidth: Integer;
  28.     FFocusColor: TColor;
  29.     FBackImageIndex: Integer;
  30.     FThumbImageIndex: Integer;
  31.     FBitmapList: TVrBitmapList;
  32.     FBitmapListLink: TVrChangeLink;
  33.     FOnChange: TNotifyEvent;
  34.     FHit: Integer;
  35.     FFocused: Boolean;
  36.     FClipOn: Boolean;
  37.     FThumbRect: TRect;
  38.     FThumbWidth: Integer;
  39.     FThumbHeight: Integer;
  40.     FThumbImage: TBitmap;
  41.     FThumbStates: TVrNumGlyphs;
  42.     FThumbIndent: Integer;
  43.     FThumbDown: Boolean;
  44.     FThumbHasMouse: Boolean;
  45.     procedure SetThumbStates(Value: TVrNumGlyphs);
  46.     procedure SetThumbIndent(Value: Integer);
  47.     procedure SetOrientation(Value: TVrOrientation);
  48.     procedure SetOffset(Value: Integer);
  49.     procedure SetPositions(Value: Integer);
  50.     procedure SetStyle(Value: TVrProgressStyle);
  51.     procedure SetOptions(Value: TVrSwitchOptions);
  52.     procedure SetBorderColor(Value: TColor);
  53.     procedure SetBorderWidth(Value: Integer);
  54.     procedure SetFocusColor(Value: TColor);
  55.     procedure SetBevel(Value: TVrBevel);
  56.     procedure SetBackImageIndex(Value: Integer);
  57.     procedure SetThumbImageIndex(Value: Integer);
  58.     procedure SetBitmapList(Value: TVrBitmapList);
  59.     procedure BevelChanged(Sender: TObject);
  60.     procedure BitmapListChanged(Sender: TObject);
  61.     procedure AdjustControlSize;
  62.     procedure WMSize(var Message: TWMSize); message WM_SIZE;
  63.     procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
  64.     procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
  65.     procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
  66.     procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  67.   protected
  68.     procedure SetThumbTop(ATop: Integer);
  69.     procedure SetThumbLeft(ALeft: Integer);
  70.     procedure CenterThumb;
  71.     procedure Paint; override;
  72.     procedure PaintThumb;
  73.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  74.     procedure CreateParams(var Params: TCreateParams); override;
  75.     procedure GetThumbImage;
  76.     procedure Change; dynamic;
  77.     function GetBitmap(Index: Integer): TBitmap;
  78.     function GetViewWidth: Integer;
  79.     function GetOffsetByValue(Value: Integer): Integer;
  80.     function GetValueByOffset(Offset: Integer): Integer;
  81.     function GetSliderRect: TRect;
  82.     function GetMinIndent(Rect: TRect): Integer;
  83.     procedure SetThumbOffset(Value: Integer);
  84.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  85.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  86.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  87.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  88.   public
  89.     constructor Create(AOwner: TComponent); override;
  90.     destructor Destroy; override;
  91.   published
  92.     property Positions: Integer read FPositions write SetPositions default 4;
  93.     property Offset: Integer read FOffset write SetOffset default 0;
  94.     property Orientation: TVrOrientation read FOrientation write SetOrientation default voVertical;
  95.     property BackImageIndex: Integer read FBackImageIndex write SetBackImageIndex default -1;
  96.     property ThumbImageIndex: Integer read FThumbImageIndex write SetThumbImageIndex default -1;
  97.     property BitmapList: TVrBitmapList read FBitmapList write SetBitmapList;
  98.     property ThumbStates: TVrNumGlyphs read FThumbStates write SetThumbStates default 1;
  99.     property ThumbIndent: Integer read FThumbIndent write SetThumbIndent default 1;
  100.     property Style: TVrProgressStyle read FStyle write SetStyle default psBottomLeft;
  101.     property Bevel: TVrBevel read FBevel write SetBevel;
  102.     property Options: TVrSwitchOptions read FOptions write SetOptions
  103.       default [soActiveClick, soMouseClip, soHandPoint, soThumbOpaque];
  104.     property BorderColor: TColor read FBorderColor write SetBorderColor default clBtnFace;
  105.     property BorderWidth: Integer read FBorderWidth write SetBorderWidth default 1;
  106.     property FocusColor: TColor read FFocusColor write SetFocusColor default clBlue;
  107.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  108. {$IFDEF VER110}
  109.     property Anchors;
  110.     property Constraints;
  111. {$ENDIF}
  112.     property Color default clBlack;
  113.     property ParentColor default false;
  114.     property DragCursor;
  115. {$IFDEF VER110}
  116.     property DragKind;
  117. {$ENDIF}
  118.     property DragMode;
  119.     property Enabled;
  120.     property ParentShowHint;
  121.     property PopupMenu;
  122.     property ShowHint;
  123.     property TabOrder;
  124.     property TabStop default False;
  125.     property Visible;
  126.     property OnClick;
  127. {$IFDEF VER130}
  128.     property OnContextPopup;
  129. {$ENDIF}
  130.     property OnKeyDown;
  131.     property OnKeyPress;
  132.     property OnKeyUp;
  133.     property OnDragDrop;
  134.     property OnDragOver;
  135. {$IFDEF VER110}
  136.     property OnEndDock;
  137. {$ENDIF}
  138.     property OnEndDrag;
  139.     property OnEnter;
  140.     property OnExit;
  141.     property OnMouseDown;
  142.     property OnMouseMove;
  143.     property OnMouseUp;
  144. {$IFDEF VER110}
  145.     property OnStartDock;
  146. {$ENDIF}
  147.     property OnStartDrag;
  148.   end;
  149. implementation
  150. {$R VRSWITCH.D32}
  151. const
  152.   ThumbNames: array[0..1] of PChar =
  153.     ('VRSWITCHTHUMB_VERT', 'VRSWITCHTHUMB_HORI');
  154. { TVrSwitch }
  155. constructor TVrSwitch.Create(AOwner: TComponent);
  156. begin
  157.   inherited Create(AOwner);
  158.   ControlStyle := ControlStyle + [csOpaque] - [csSetCaption];
  159.   Width := 29;
  160.   Height := 60;
  161.   Tabstop := False;
  162.   Color := clBlack;
  163.   ParentColor := false;
  164.   FPositions := 4;
  165.   FOffset := 0;
  166.   FOrientation := voVertical;
  167.   FOptions := [soActiveClick, soMouseClip, soHandPoint, soThumbOpaque];
  168.   FStyle := psBottomLeft;
  169.   FBorderColor := clBtnFace;
  170.   FBorderWidth := 1;
  171.   FFocusColor := clBlue;
  172.   FBevel := TVrBevel.Create;
  173.   with FBevel do
  174.   begin
  175.     InnerSpace := 0;
  176.     OuterOutline := osNone;
  177.     OnChange := BevelChanged;
  178.   end;
  179.   FBackImageIndex := -1;
  180.   FThumbImageIndex := -1;
  181.   FBitmapListLink := TVrChangeLink.Create;
  182.   FBitmapListLink.OnChange := BitmapListChanged;
  183.   FThumbStates := 1;
  184.   FThumbIndent := 1;
  185.   FThumbImage := TBitmap.Create;
  186.   GetThumbImage;
  187. end;
  188. destructor TVrSwitch.Destroy;
  189. begin
  190.   FThumbImage.Free;
  191.   FBevel.Free;
  192.   FBitmapListLink.Free;
  193.   inherited Destroy;
  194. end;
  195. procedure TVrSwitch.CreateParams(var Params: TCreateParams);
  196. begin
  197.   inherited CreateParams(Params);
  198.   with Params do
  199.     WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
  200. end;
  201. procedure TVrSwitch.GetThumbImage;
  202. begin
  203.   FThumbImage.Assign(GetBitmap(FThumbImageIndex));
  204.   if FThumbImage.Empty then
  205.   begin
  206.     if Orientation = voVertical then
  207.     FThumbImage.LoadFromResourceName(hInstance, ThumbNames[0])
  208.     else FThumbImage.LoadFromResourceName(hInstance, ThumbNames[1]);
  209.   end;
  210.   FThumbHeight := FThumbImage.Height;
  211.   FThumbWidth := FThumbImage.Width div ThumbStates;
  212.   AdjustControlSize;
  213.   CenterThumb;
  214. end;
  215. procedure TVrSwitch.SetThumbLeft(ALeft: Integer);
  216. begin
  217.   FThumbRect := Bounds(ALeft, FThumbRect.Top, FThumbWidth, FThumbHeight);
  218. end;
  219. procedure TVrSwitch.SetThumbTop(ATop: Integer);
  220. begin
  221.   FThumbRect := Bounds(FThumbRect.Left, ATop, FThumbWidth, FThumbHeight);
  222. end;
  223. procedure TVrSwitch.CenterThumb;
  224. begin
  225.   if Orientation = voVertical then
  226.     SetThumbLeft((Width - FThumbWidth) div 2)
  227.   else SetThumbTop((Height - FThumbHeight) div 2);
  228. end;
  229. function TVrSwitch.GetSliderRect: TRect;
  230. begin
  231.   Result := ClientRect;
  232.   InflateRect(Result, -BorderWidth - ThumbIndent, -BorderWidth - ThumbIndent);
  233. end;
  234. function TVrSwitch.GetMinIndent(Rect: TRect): Integer;
  235. begin
  236.   if Orientation = voVertical then
  237.     Result := MaxIntVal(0, Rect.Top)
  238.   else
  239.     Result := MaxIntVal(0, Rect.Left);
  240. end;
  241. function TVrSwitch.GetViewWidth: Integer;
  242. var
  243.   R: TRect;
  244. begin
  245.   R := GetSliderRect;
  246.   if Orientation = voVertical then
  247.   Result := HeightOf(R) - FThumbHeight
  248.   else Result := WidthOf(R) - FThumbWidth;
  249. end;
  250. function TVrSwitch.GetOffsetByValue(Value: Integer): Integer;
  251. var
  252.   Range: Double;
  253.   R: TRect;
  254.   MinIndent: Integer;
  255. begin
  256.   R := GetSliderRect;
  257.   MinIndent := GetMinIndent(R);
  258.   Range := Positions - 1;
  259.   Result := Round(Value / Range * GetViewWidth) + MinIndent;
  260.   if (FOrientation = voVertical) and (FStyle = psBottomLeft) then
  261.     Result := R.Top + R.Bottom - Result - FThumbHeight
  262.   else
  263.   if (FOrientation = voHorizontal) and (FStyle = psTopRight) then
  264.     Result := R.Left + R.Right - Result - FThumbWidth;
  265. end;
  266. function TVrSwitch.GetValueByOffset(Offset: Integer): Integer;
  267. var
  268.   R: TRect;
  269.   Range: Double;
  270.   MinIndent: Integer;
  271. begin
  272.   R := GetSliderRect;
  273.   MinIndent := GetMinIndent(R);
  274.   if Orientation = voVertical then
  275.     Offset := ClientHeight - Offset - FThumbHeight;
  276.   Range := Positions - 1;
  277.   Result := Round((Offset - MinIndent) * Range / GetViewWidth);
  278.   Result := MinIntVal(MaxIntVal(Result, 0), Positions - 1);
  279. end;
  280. procedure TVrSwitch.SetThumbOffset(Value: Integer);
  281. var
  282.   R: TRect;
  283.   MinIndent: Integer;
  284. begin
  285.   R := GetSliderRect;
  286.   MinIndent := GetMinIndent(R);
  287.   Value := MinIntVal(MaxIntVal(Value, MinIndent),
  288.     MinIndent + GetViewWidth);
  289.   if FStyle = psBottomLeft then Offset := GetValueByOffset(Value)
  290.   else Offset := Pred(Positions) - GetValueByOffset(Value);
  291. end;
  292. procedure TVrSwitch.BitmapListChanged(Sender: TObject);
  293. begin
  294.   GetThumbImage;
  295.   UpdateControlCanvas;
  296. end;
  297. procedure TVrSwitch.BevelChanged(Sender: TObject);
  298. begin
  299.   UpdateControlCanvas;
  300. end;
  301. procedure TVrSwitch.Paint;
  302. var
  303.   R: TRect;
  304.   aGlyph: TBitmap;
  305.   Value: Integer;
  306.   CurrentColor: TColor;
  307. begin
  308.   ClearBitmapCanvas;
  309.   R := ClientRect;
  310.   if BorderWidth > 0 then
  311.   begin
  312.     if FFocused then CurrentColor := FFocusColor
  313.     else CurrentColor := FBorderColor;
  314.     DrawFrame3D(BitmapCanvas, R,
  315.       CurrentColor, CurrentColor, BorderWidth);
  316.   end;
  317.   FBevel.Paint(BitmapCanvas, R);
  318.   aGlyph := GetBitmap(BackImageIndex);
  319.   if aGlyph <> nil then BitmapCanvas.StretchDraw(R, aGlyph);
  320.   Value := GetOffsetByValue(Offset);
  321.   if Orientation = voVertical then
  322.     SetThumbTop(Value) else SetThumbLeft(Value);
  323.   PaintThumb;
  324.   inherited Paint;
  325. end;
  326. procedure TVrSwitch.PaintThumb;
  327. var
  328.   Index: Integer;
  329.   SrcRect: TRect;
  330.   TransColor: TColor;
  331. begin
  332.   Index := 0;
  333.   if not Enabled then Index := 1;
  334.   if FThumbDown then Index := 2;
  335.   if (FThumbHasMouse) and (not FThumbDown) then Index := 3;
  336.   if Index > ThumbStates - 1 then Index := 0;
  337.   SrcRect := Bounds(Index * FThumbWidth, 0, FThumbWidth, FThumbHeight);
  338.   with BitmapCanvas do
  339.   begin
  340.     TransColor := FThumbImage.TransparentColor;
  341.     Brush.Color := TransColor;
  342.     if soThumbOpaque in Options then Brush.Style := bsSolid
  343.     else Brush.Style := bsClear;
  344.     BrushCopy(FThumbRect, FThumbImage, SrcRect, TransColor);
  345.   end;
  346. end;
  347. procedure TVrSwitch.AdjustControlSize;
  348. var
  349.   NewWidth, NewHeight: Integer;
  350. begin
  351.   if Orientation = voHorizontal then
  352.   begin
  353.     NewWidth := (FThumbWidth * FPositions) + (BorderWidth * 2);
  354.     NewHeight := MaxIntVal(FThumbHeight + FBorderWidth * 2, Height);
  355.   end
  356.   else
  357.   begin
  358.     NewWidth := MaxIntVal(FThumbWidth + FBorderWidth * 2, Width);
  359.     NewHeight := (FThumbHeight * FPositions) + (BorderWidth * 2);
  360.   end;
  361.   BoundsRect := Bounds(Left, Top, NewWidth, NewHeight);
  362. end;
  363. procedure TVrSwitch.WMSize(var Message: TWMSize);
  364. begin
  365.   inherited;
  366.   AdjustControlSize;
  367.   CenterThumb;
  368. end;
  369. procedure TVrSwitch.WMSetCursor(var Message: TWMSetCursor);
  370. var
  371.   P: TPoint;
  372. begin
  373.   GetCursorPos(P);
  374.   if (not Designing) and PtInRect(FThumbRect, ScreenToClient(P)) then
  375.   begin
  376.     if (soHandPoint in Options) then
  377.       Windows.SetCursor(Screen.Cursors[VrCursorHandPoint]);
  378.   end else inherited;
  379. end;
  380. procedure TVrSwitch.WMGetDlgCode(var Msg: TWMGetDlgCode);
  381. begin
  382.   Msg.Result := DLGC_WANTARROWS;
  383. end;
  384. procedure TVrSwitch.CMFocusChanged(var Message: TCMFocusChanged);
  385. var
  386.   Active: Boolean;
  387. begin
  388.   with Message do Active := (Sender = Self);
  389.   if Active <> FFocused then
  390.   begin
  391.     FFocused := Active;
  392.     UpdateControlCanvas;
  393.   end;
  394.   inherited;
  395. end;
  396. procedure TVrSwitch.CMEnabledChanged(var Message: TMessage);
  397. begin
  398.   inherited;
  399.   UpdateControlCanvas;
  400. end;
  401. procedure TVrSwitch.Notification(AComponent: TComponent;
  402.   Operation: TOperation);
  403. begin
  404.   inherited Notification(AComponent, Operation);
  405.   if (Operation = opRemove) then
  406.     if AComponent = BitmapList then BitmapList := nil;
  407. end;
  408. function TVrSwitch.GetBitmap(Index: Integer): TBitmap;
  409. begin
  410.   Result := nil;
  411.   if Assigned(FBitmapList) then
  412.     Result := FBitmapList.GetBitmap(Index);
  413. end;
  414. procedure TVrSwitch.Change;
  415. begin
  416.   if Assigned(FOnChange) then FOnChange(Self);
  417. end;
  418. procedure TVrSwitch.SetThumbStates(Value: TVrNumGlyphs);
  419. begin
  420.   if FThumbStates <> Value then
  421.   begin
  422.     FThumbStates := Value;
  423.     if not Loading then
  424.       GetThumbImage;
  425.     UpdateControlCanvas;
  426.   end;
  427. end;
  428. procedure TVrSwitch.SetThumbIndent(Value: Integer);
  429. begin
  430.   if (FThumbIndent <> Value) and (Value >= 0) then
  431.   begin
  432.     FThumbIndent := Value;
  433.     UpdateControlCanvas;
  434.   end;
  435. end;
  436. procedure TVrSwitch.SetBackImageIndex(Value: Integer);
  437. begin
  438.   if FBackImageIndex <> Value then
  439.   begin
  440.     FBackImageIndex := Value;
  441.     UpdateControlCanvas;
  442.   end;
  443. end;
  444. procedure TVrSwitch.SetThumbImageIndex(Value: Integer);
  445. begin
  446.   if FThumbImageIndex <> Value then
  447.   begin
  448.     FThumbImageIndex := Value;
  449.     GetThumbImage;
  450.     UpdateControlCanvas;
  451.   end;
  452. end;
  453. procedure TVrSwitch.SetBitmapList(Value: TVrBitmapList);
  454. begin
  455.   if FBitmapList <> nil then
  456.     FBitmapList.RemoveLink(FBitmapListLink);
  457.   FBitmapList := Value;
  458.   if FBitmapList <> nil then
  459.     FBitmapList.InsertLink(FBitmapListLink);
  460.   GetThumbImage;
  461.   UpdateControlCanvas;
  462. end;
  463. procedure TVrSwitch.SetOrientation(Value: TVrOrientation);
  464. begin
  465.   if FOrientation <> Value then
  466.   begin
  467.     FOrientation := Value;
  468.     GetThumbImage;
  469.     if not Loading then
  470.     begin
  471.       BoundsRect := Bounds(Left, Top, Height, Width);
  472.       AdjustControlSize;
  473.     end;
  474.     UpdateControlCanvas;
  475.   end;
  476. end;
  477. procedure TVrSwitch.SetStyle(Value: TVrProgressStyle);
  478. begin
  479.   if FStyle <> Value then
  480.   begin
  481.     FStyle := Value;
  482.     UpdateControlCanvas;
  483.   end;
  484. end;
  485. procedure TVrSwitch.SetOffset(Value: Integer);
  486. begin
  487.   if Value < 0 then Value := 0;
  488.   if Value > Positions - 1 then Value := Positions - 1;
  489.   if FOffset <> Value then
  490.   begin
  491.     FOffset := Value;
  492.     UpdateControlCanvas;
  493.     Change;
  494.   end;
  495. end;
  496. procedure TVrSwitch.SetPositions(Value: Integer);
  497. begin
  498.   if FPositions <> Value then
  499.   begin
  500.     FPositions := Value;
  501.     AdjustControlSize;
  502.   end;
  503. end;
  504. procedure TVrSwitch.SetOptions(Value: TVrSwitchOptions);
  505. begin
  506.   if FOptions <> Value then
  507.   begin
  508.     FOptions := Value;
  509.     UpdateControlCanvas;
  510.   end;
  511. end;
  512. procedure TVrSwitch.SetBorderColor(Value: TColor);
  513. begin
  514.   if FBorderColor <> Value then
  515.   begin
  516.     FBorderColor := Value;
  517.     UpdateControlCanvas;
  518.   end;
  519. end;
  520. procedure TVrSwitch.SetBorderWidth(Value: Integer);
  521. begin
  522.   if (FBorderWidth <> Value) and (Value >= 0) then
  523.   begin
  524.     FBorderWidth := Value;
  525.     AdjustControlSize;
  526.     UpdateControlCanvas;
  527.   end;
  528. end;
  529. procedure TVrSwitch.SetFocusColor(Value: TColor);
  530. begin
  531.   if FFocusColor <> Value then
  532.   begin
  533.     FFocusColor := Value;
  534.     UpdateControlCanvas;
  535.   end;
  536. end;
  537. procedure TVrSwitch.SetBevel(Value: TVrBevel);
  538. begin
  539.   FBevel.Assign(Value);
  540. end;
  541. procedure TVrSwitch.MouseDown(Button: TMouseButton; Shift: TShiftState;
  542.   X, Y: Integer);
  543. var
  544.   R: TRect;
  545.   P: TPoint;
  546. begin
  547.   inherited MouseDown(Button, Shift, X, Y);
  548.   if (Button = mbLeft) then
  549.   begin
  550.     if TabStop then SetFocus;
  551.     P := Point(X, Y);
  552.     if PtInRect(FThumbRect, P) then
  553.     begin
  554.       FThumbDown := True;
  555.       if Orientation = voHorizontal then FHit := X - FThumbRect.Left
  556.       else FHit := Y - FThumbRect.Top;
  557.       if (soMouseClip in Options) then
  558.       begin
  559.         R := Bounds(ClientOrigin.X, ClientOrigin.Y,
  560.           ClientWidth, ClientHeight);
  561.         ClipCursor(@R);
  562.         FClipOn := True;
  563.       end;
  564.       UpdateControlCanvas;
  565.     end
  566.     else
  567.     if (soActiveClick in Options) then
  568.     begin
  569.       if Orientation = voHorizontal then
  570.         FHit := X - FThumbWidth div 2
  571.       else FHit := Y - FThumbHeight div 2;
  572.       SetThumbOffset(FHit);
  573.     end;
  574.   end;
  575. end;
  576. procedure TVrSwitch.MouseMove(Shift: TShiftState; X, Y: Integer);
  577. var
  578.   OldValue: Boolean;
  579. begin
  580.   if FThumbDown then
  581.   begin
  582.     if FOrientation = voVertical then
  583.       SetThumbOffset(Y - FHit)
  584.     else
  585.       SetThumbOffset(X - FHit);
  586.   end
  587.   else
  588.   begin
  589.     OldValue := FThumbHasMouse;
  590.     FThumbHasMouse := PtInRect(FThumbRect, Point(X, Y));
  591.     if OldValue <> FThumbHasMouse then UpdateControlCanvas;
  592.   end;
  593.   inherited MouseMove(Shift, X, Y);
  594. end;
  595. procedure TVrSwitch.MouseUp(Button: TMouseButton; Shift: TShiftState;
  596.   X, Y: Integer);
  597. begin
  598.   if FThumbDown then
  599.   begin
  600.     FThumbDown := false;
  601.     UpdateControlCanvas;
  602.   end;
  603.   if FClipOn then
  604.   begin
  605.     ClipCursor(nil);
  606.     FClipOn := false;
  607.   end;
  608.   inherited MouseUp(Button, Shift, X, Y);
  609. end;
  610. procedure TVrSwitch.KeyDown(var Key: Word; Shift: TShiftState);
  611.   function Adjust(Value: Integer): Integer;
  612.   begin
  613.     Result := Value;
  614.     if Style = psTopRight then Result := -Result;
  615.   end;
  616. begin
  617.   if Shift = [] then
  618.   begin
  619.     if Key = VK_HOME then Offset := 0
  620.     else if Key = VK_END then Offset := Positions - 1;
  621.     if Orientation = voHorizontal then
  622.     begin
  623.       if Key = VK_LEFT then Offset := Offset + Adjust(-1)
  624.       else if Key = VK_RIGHT then Offset := Offset + Adjust(1);
  625.     end
  626.     else
  627.     begin
  628.       if Key = VK_UP then Offset := Offset + Adjust(1)
  629.       else if Key = VK_DOWN then Offset := Offset + Adjust(-1);
  630.     end;
  631.   end;
  632.   inherited KeyDown(Key, Shift);
  633. end;
  634. end.