📄 islider.pas
字号:
begin
FMouseControlStyle := Value;
end;
end;
//****************************************************************************************************************************************************
procedure TiSlider.SetOrientation(const Value: TiOrientation);
var
TempWidth : Integer;
begin
if FOrientation <> Value then
begin
FOrientation := Value;
if not Loading then
begin
TempWidth := Width;
Width := Height;
Height := TempWidth;
if Assigned(FOnAutoSize) then FOnAutoSize(Self);
end;
BackGroundChange;
end;
end;
//****************************************************************************************************************************************************
procedure TiSlider.SetPointerStyle(const Value: TiSliderPointerStyle);
begin
if FPointerStyle <> Value then
begin
FPointerStyle := Value;
case FPointerStyle of
ispsLed : FTrack3DMargin := 2;
ispsPointer : FTrack3DMargin := 0;
ispsBar : FTrack3DMargin := 0;
ispsLightBar : FTrack3DMargin := 0;
ispsBarColor : FTrack3DMargin := 0;
ispsBitmap : FTrack3DMargin := 0;
end;
BackGroundChange;
end;
end;
//****************************************************************************************************************************************************
procedure TiSlider.SetPointerBitmap(const Value: TBitmap);
begin
FPointerBitmap.Assign(Value);
FPointerBitmap.Transparent := True;
FPointerBitmap.TransparentMode := tmAuto;
end;
//****************************************************************************************************************************************************
function TiSlider.GetTravelRange: Integer;
var
DrawRect : TRect;
begin
DrawRect := Rect(0, 0 ,Width, Height);
with DrawRect do
case FOrientation of
ioVertical : Result := Bottom - Top - FPointerHeight - (2 * FEndsMargin) - (2 * FTrack3DMargin);
else Result := Right - Left - FPointerHeight - (2 * FEndsMargin) - (2 * FTrack3DMargin);
end;
end;
//****************************************************************************************************************************************************
function TiSlider.GetPixelsToPosition(Value: Integer): Double;
var
DrawRect : TRect;
PointRangePercent : Double;
StartPosition : Double;
begin
DrawRect := Rect(0, 0 ,Width, Height);
with DrawRect do
case FOrientation of
ioVertical : if FReverseScale then StartPosition := Top + FEndsMargin + FTrack3DMargin + FPointerHeight/2
else StartPosition := Bottom - FEndsMargin - FTrack3DMargin - FPointerHeight/2;
else if FReverseScale then StartPosition := Right - FEndsMargin - FTrack3DMargin - FPointerHeight/2
else StartPosition := Left + FEndsMargin + FTrack3DMargin + FPointerHeight/2;
end;
with DrawRect do
case FOrientation of
ioVertical : if FReverseScale then PointRangePercent := (Value - StartPosition)/TravelRange
else PointRangePercent := (StartPosition - Value)/TravelRange;
else if FReverseScale then PointRangePercent := (StartPosition - Value)/TravelRange
else PointRangePercent := (Value - StartPosition)/TravelRange;
end;
if PointRangePercent > 1 then PointRangePercent := 1;
if PointRangePercent < 0 then PointRangePercent := 0;
Result := PointRangePercent*(PositionMax - PositionMin) + PositionMin;
end;
//****************************************************************************************************************************************************
procedure TiSlider.CalcPoints;
var
ClientRect : TRect;
PointerOffset : Integer;
TrackWidth : Integer;
TrackOffet : Integer;
begin
FPointerRect := Rect(0,0,0,0);
ClientRect := Rect(0, 0 ,Width, Height);
case FPointerStyle of
ispsLed : begin FPointerOverlap := 0; TrackOffet := 0; end;
ispsPointer : begin FPointerOverlap := 4; TrackOffet := 5; end;
ispsBitmap : begin FPointerOverlap := 4; TrackOffet := 5; end;
ispsBar : begin FPointerOverlap := 4; TrackOffet := 5; end;
ispsBarColor : begin FPointerOverlap := 4; TrackOffet := 5; end;
ispsLightBar : begin FPointerOverlap := 4; TrackOffet := 5; end;
else begin FPointerOverlap := 0; TrackOffet := 0; end;
end;
if FReverseScale then
PointerOffset := TravelRange - Round(TravelRange * ValuePercent(Position))
else PointerOffset := Round(TravelRange * ValuePercent(Position));
with ClientRect do
begin
TrackWidth := FPointerWidth + 2*FTrack3DMargin;
case FOrientation of
ioVertical : begin
case FOrientationTickMarks of
iosTopLeft : FTrackRect := Rect(Right-TrackOffet-TrackWidth-2,Top+FEndsMargin,Right-TrackOffet-2, Bottom-FEndsMargin);
iosBottomRight : FTrackRect := Rect(Left +TrackOffet +2,Top+FEndsMargin,Left +TrackOffet+TrackWidth+2,Bottom-FEndsMargin);
end;
with FTrackRect do
case FPointerStyle of
ispsLed : FPointerRect:=Rect(Left+FTrack3DMargin, Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right-FTrack3DMargin, Bottom-FTrack3DMargin-PointerOffset);
ispsPointer : FPointerRect:=Rect(Left-FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right+FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset);
ispsBitmap : FPointerRect:=Rect(Left-FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right+FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset);
ispsBar : FPointerRect:=Rect(Left-FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right+FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset);
ispsBarColor : FPointerRect:=Rect(Left-FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right+FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset);
ispsLightBar : FPointerRect:=Rect(Left-FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset-FPointerHeight,Right+FPointerOverlap,Bottom-FTrack3DMargin-PointerOffset);
end;
end;
ioHorizontal : begin
case FOrientationTickMarks of
iosTopLeft : FTrackRect := Rect(Left + FEndsMargin, Bottom - TrackWidth - TrackOffet -2, Right - FEndsMargin, Bottom - TrackOffet -2 );
iosBottomRight : FTrackRect := Rect(Left + FEndsMargin, Top + TrackOffet +2, Right - FEndsMargin, Top + TrackWidth + TrackOffet +2);
end;
with FTrackRect do
case FPointerStyle of
ispsLed : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top+FTrack3DMargin, Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom-FTrack3DMargin);
ispsPointer : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top-FPointerOverlap,Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom+FPointerOverlap);
ispsBitmap : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top-FPointerOverlap,Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom+FPointerOverlap);
ispsBar : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top-FPointerOverlap,Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom+FPointerOverlap);
ispsBarColor : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top-FPointerOverlap,Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom+FPointerOverlap);
ispsLightBar : FPointerRect:=Rect(Left+FTrack3DMargin+PointerOffset,Top-FPointerOverlap,Left+FTrack3DMargin+PointerOffset+FPointerHeight,Bottom+FPointerOverlap);
end;
end;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiSlider.CalcAutoCenterOffsets;
var
TotalWidth : Integer;
ATextWidth : Integer;
begin
FCenterOffsetX := 0;
FCenterOffsetY := 0;
if not FAutoCenter then Exit;
if ShowTickLabels then
begin
with Canvas do
begin
Font.Assign(TickLabelFont);
case Orientation of
ioVertical : ATextWidth := TextWidth (Trim(Format('%.' + IntToStr(GetDecimalPoints) + 'f', [PositionMax])));
else ATextWidth := TextHeight(Trim(Format('%.' + IntToStr(GetDecimalPoints) + 'f', [PositionMax])));
end;
TotalWidth := TickMargin + TickMajorLength + TickLabelMargin + ATextWidth;
end;
end
else if ShowTicksMajor then TotalWidth := TickMargin + TickMajorLength
else TotalWidth := 0;
case FOrientation of
ioVertical : begin
TotalWidth := TotalWidth + FTrackRect.Right - FTrackRect.Left + FPointerOverlap;
FCenterOffsetX := (Width - TotalWidth) div 2;
end;
ioHorizontal : begin
TotalWidth := TotalWidth + FTrackRect.Bottom - FTrackRect.Top + FPointerOverlap;
FCenterOffsetY := (Height - TotalWidth) div 2;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiSlider.iPaintTo(Canvas: TCanvas);
begin
CalcPoints;
CalcAutoCenterOffsets;
case FOrientation of
ioVertical : begin
case FOrientationTickMarks of
iosBottomRight : begin
OffsetRect(FTrackRect, OffsetX, 0);
OffsetRect(FPointerRect, OffsetX, 0);
OffsetRect(FTrackRect, FCenterOffsetX, 0);
OffsetRect(FPointerRect, FCenterOffsetX, 0);
end;
iosTopLeft : begin
OffsetRect(FTrackRect, -OffsetX, 0);
OffsetRect(FPointerRect, -OffsetX, 0);
OffsetRect(FTrackRect, -FCenterOffsetX, 0);
OffsetRect(FPointerRect, -FCenterOffsetX, 0);
end;
end;
end;
ioHorizontal : begin
case FOrientationTickMarks of
iosBottomRight : begin
OffsetRect(FTrackRect, 0, OffsetY);
OffsetRect(FPointerRect, 0, OffsetY);
OffsetRect(FTrackRect, 0, FCenterOffsetY);
OffsetRect(FPointerRect, 0, FCenterOffsetY);
end;
iosTopLeft : begin
OffsetRect(FTrackRect, 0, -OffsetY);
OffsetRect(FPointerRect, 0, -OffsetY);
OffsetRect(FTrackRect, 0, -FCenterOffsetY);
OffsetRect(FPointerRect, 0, -FCenterOffsetY);
end;
end;
end;
end;
DrawBackGround(Canvas, BackGroundColor);
DrawBar (Canvas);
DrawTicks (Canvas);
DrawIndicator (Canvas);
if FShowFocusRect and HasFocus then iDrawFocusRect(Canvas, ClientRect, BackGroundColor);
end;
//****************************************************************************************************************************************************
procedure TiSlider.DrawBar(Canvas: TCanvas);
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -