1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398:
| unit SliderC;
interface
uses SysUtils, Classes, Windows, Messages, Graphics, Controls, ExtCtrls;
type TSliderC = class(TCustomControl) private FImageRuler: TBitmap; FImageThumb: TBitmap; FThumb1: TBitmap; FThumb2: TBitmap; FHorizontal: Boolean; FClicked: Boolean; FTracking: Boolean; FMaximum: Integer; FDifference: Real; FPosition: Integer; FFrom: Integer; FChanged: Boolean; FChanging: Boolean; FOnChanged: TNotifyEvent; FOnStopChanged: TNotifyEvent; FOnBeginChange: TNotifyEvent; FTimer: TTimer; procedure SetImageThumb(Value: TBitmap); procedure SetImageRuler(Value: TBitmap); procedure ThumbChanged(Sender: TObject); procedure SetMaximum(Value: Integer); procedure Calculate; procedure ReCalcule(Sender: TObject); procedure SetPosition(Value: Integer); procedure Loading(Sender: TObject); protected procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND; public constructor Create(AOwner: TComponent); override; destructor Destroy; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure Paint; override; function CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; override; published property ImageRuler: TBitmap read FImageRuler write SetImageRuler; property ImageThumb: TBitmap read FImageThumb write SetImageThumb; property Align; property Anchors; property Constraints;
property Visible; property Enabled; property Cursor; property DragMode; property DragCursor; property ParentShowHint; property ShowHint; property TabOrder; property Width default 191; property Height default 11; property AutoSize default True; property Horizontal: Boolean read FHorizontal write FHorizontal default True; property Maximum: Integer read FMaximum write SetMaximum default 100; property Position: Integer read FPosition write SetPosition default 0; property OnClick; property OnDblClick; property OnEnter; property OnExit; property OnKeyDown; property OnKeyUp; property OnKeyPress; property OnDragOver; property OnDragDrop; property OnEndDrag; property OnStartDrag; property OnBeginChange: TNotifyEvent read FOnBeginChange write FOnBeginChange; property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; property OnStopChanged: TNotifyEvent read FOnStopChanged write FOnStopChanged; end;
procedure Register ;
implementation
{$R SliderC.res}
procedure Register ; begin RegisterComponents('Samples', [TSliderC]) ; end ;
constructor TSliderC.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csOpaque]; Width := 191; Height := 11; FImageRuler := TBitmap.Create; FImageThumb := TBitmap.Create; FThumb1 := TBitmap.Create; FThumb2 := TBitmap.Create; FClicked := False; FMaximum := 100; FTracking := False; FPosition := 0; FFrom := 0; FChanged := False; FHorizontal := True; FChanging := False; FImageThumb.LoadFromFile('THUMB.BMP'); FImageRuler.LoadFromFile('RULER.BMP'); Calculate; FImageThumb.OnChange := ThumbChanged; Self.OnResize := ReCalcule; Calculate; FTimer := TTimer.Create(Self); FTimer.Interval := 10; FTimer.OnTimer := Loading; FTimer.Enabled := True; AutoSize := True; end;
destructor TSliderC.Destroy; begin FImageRuler.Free; FImageThumb.Free; FThumb1.Free; FThumb2.Free; inherited Destroy; end;
procedure TSliderC.Paint; var T: TRect; begin T.Left := 0; T.Top := 0; T.Right := Width; T.Bottom := Height; Canvas.StretchDraw(T, FImageRuler); if FHorizontal then begin T.Left := Round(FDifference * FPosition); if Height - FThumb1.Height < 0 then T.Top := 0 else T.Top := (Height - FThumb1.Height) div 2; FFrom := T.Top; Canvas.Draw(T.Left, T.Top, FThumb1); FClicked := False; end else begin if Width - FThumb1.Width < 0 then T.Left := 0 else T.Left := (Width - FThumb1.Width) div 2; T.Top := Round(FDifference * FPosition); FFrom := T.Left; Canvas.Draw(T.Left, T.Top, FThumb1); FClicked := False; end; end;
procedure TSliderC.SetMaximum(Value: Integer); begin FMaximum := Value; if FPosition > FMaximum then FPosition := FMaximum; Calculate; SetPosition(FPosition); end;
procedure TSliderC.SetPosition(Value: Integer); begin if Value > FMaximum then Value := FMaximum; if Value < 0 then Value := 0; FPosition := Value;
if not FTracking then begin Calculate; Repaint; end; end;
procedure TSliderC.Calculate; begin if FHorizontal then FDifference := (Width - FThumb1.Width) / FMaximum else FDifference := (Height - FThumb1.Height) / FMaximum; end;
procedure TSliderC.ReCalcule(Sender: TObject); begin Calculate; end;
procedure TSliderC.MouseMove(Shift: TShiftState; X, Y: Integer); var I: Integer; begin if FTracking and (ssLeft in Shift) then begin if FHorizontal then begin if (Y in [0..FThumb1.Height]) or FChanging then begin I := X - FThumb1.Width div 2; if I > 0 then begin FChanging := True; I := Round(I / FDifference); if I > FMaximum then I := FMaximum; FPosition := I; if Assigned(FOnChanged) then FOnChanged(Self); Repaint; end; end; end else begin if (X in [0..FThumb1.Width]) or FChanging then begin I := Y - FThumb1.Height div 2; if I > 0 then begin FChanging := True; I := Round(I / FDifference); if I > FMaximum then I := FMaximum; FPosition := I; if Assigned(FOnChanged) then FOnChanged(Self); Repaint; end; end; end; Repaint; end; end;
procedure TSliderC.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Tmp: TBitmap; R: TRect; P: TPoint; begin FTracking := True; MouseCapture := True; R := ClientRect; P := ClientToScreen(Point(0,0)); OffsetRect(R, P.X, P.Y); ClipCursor(@R); if Assigned(FOnBeginChange) then FOnBeginChange(Self); if not FChanged then begin Tmp := TBitmap.Create; Tmp.Assign(FThumb1); FThumb1.Assign(FThumb2); FThumb2.Assign(Tmp); Tmp.Free; FChanged := True; end; Repaint; end;
procedure TSliderC.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Tmp: TBitmap; begin FTracking := False; FChanging := False; ClipCursor(nil); if FChanged then begin Tmp := TBitmap.Create; Tmp.Assign(FThumb1); FThumb1.Assign(FThumb2); FThumb2.Assign(Tmp); Tmp.Free; FChanged := False; end; Repaint; if Assigned(FOnStopChanged) then FOnStopChanged(Self); end;
procedure TSliderC.ThumbChanged(Sender: TObject); var Src, Dest: TRect; begin Dest.Left := 0; Dest.Top := 0; Dest.Right := FImageThumb.Width div 2; Dest.Bottom := FImageThumb.Height; FThumb1.Width := Dest.Right; FThumb1.Height := Dest.Bottom; FThumb1.Canvas.CopyRect(Dest, FImageThumb.Canvas, Dest); FThumb2.Width := Dest.Right; FThumb2.Height := Dest.Bottom; Dest.Left := Dest.Right; Dest.Top := 0; Dest.Bottom := FImageThumb.Height; Dest.Right := FImageThumb.Width; Src.Left := 0; Src.Top := 0; Src.Right := Dest.Left; Src.Bottom := FImageThumb.Height; FThumb2.Canvas.CopyRect(Src, FImageThumb.Canvas, Dest); Invalidate; Calculate; end;
procedure TSliderC.SetImageThumb(Value: TBitmap); begin FImageThumb.Assign(Value); ThumbChanged(nil); end;
procedure TSliderC.SetImageRuler(Value: TBitmap); begin FImageRuler.Assign(Value); if (Value.Width > 0) and (Value.Height > 0) and AutoSize then begin Height := Value.Height; Width := Value.Width; end; Repaint; Calculate; end;
procedure TSliderC.Loading(Sender: TObject); begin FTimer.Enabled := False; SetImageThumb(FImageThumb); ThumbChanged(Self); Calculate; FTimer.Free; end;
procedure TSliderC.WMEraseBkgnd(var Msg: TWMEraseBkgnd); begin Msg.Result := 1; end;
function TSliderC.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean; begin if AutoSize and (FImageRuler.Width > 0) and (FImageRuler.Height > 0) then begin NewHeight := FImageRuler.Height; NewWidth := FImageRuler.Width; Result := True; end else Result := False; end;
end.
|