📄 fctrackbar.pas
字号:
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_DIAGONAL_ENDTOPLEFT);
ThumbRect.Left:= ALeft + DiagonalHeight;
ThumbRect.Right:=ALeft + TrackButton.ClientWidth;
Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
Triangle[1]:= Point(ThumbRect.Right-2, ThumbRect.Top);
Triangle[2]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
Pen.Color:=ThumbColor;
Pen.Color:=ThumbColor;
Brush.Color:= ThumbColor;
Polygon(Triangle);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
{BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMLEFT);
end;
end
else begin
with Canvas do begin
ThumbRect.Top:= ATop;
ThumbRect.Bottom:= ThumbRect.Top + TrackButton.ClientHeight;
DiagonalHeight:= (ThumbRect.Bottom-ThumbRect.Top) div 2;
ThumbRect.Left:= ALeft;
if TickMarks = tmfcBoth then
begin
ThumbRect.Right:= ThumbRect.Left + ThumbLength;
Brush.Color:= ThumbColor;
FillRect(ThumbRect);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,
BF_TOP or BF_LEFT);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,
BF_BOTTOM + BF_RIGHT);
exit;
end
else if TickMarks = tmfcBottomRight then
begin
ThumbRect.Right:= ThumbRect.Left + ThumbLength - DiagonalHeight;
Brush.Color:= ThumbColor;
FillRect(ThumbRect);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_TOP or BF_LEFT);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_BOTTOM);
ThumbRect.Left:= ThumbRect.Right-1;
ThumbRect.Right:= ThumbRect.Left + DiagonalHeight;
ThumbRect.Top:= ThumbRect.Top + 1;
ThumbRect.Bottom:= ThumbRect.Top+ DiagonalHeight;
Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
Triangle[1]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
Triangle[2]:= Point(ThumbRect.Right-1, ThumbRect.Bottom-1);
Pen.Color:=ThumbColor;
Brush.Color:= ThumbColor;
Polygon(Triangle);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_DIAGONAL_ENDTOPLEFT);
ThumbRect.Top:= ATop + DiagonalHeight;
ThumbRect.Bottom:=ATop + TrackButton.ClientHeight;
Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
Triangle[1]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
Triangle[2]:= Point(ThumbRect.Right-1, ThumbRect.Top);
Pen.Color:=ThumbColor;
Brush.Color:= ThumbColor;
Polygon(Triangle);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
{BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMLEFT);
end
else begin
ThumbRect.Left:= ThumbRect.Left + DiagonalHeight - 1;
ThumbRect.Right:= ThumbRect.Left + ThumbLength - DiagonalHeight;
Brush.Color:= ThumbColor;
FillRect(ThumbRect);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_TOP or BF_RIGHT);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_BOTTOM);
ThumbRect.Left:= ThumbRect.Left - DiagonalHeight+1;
ThumbRect.Right:= ThumbRect.Left + DiagonalHeight;
ThumbRect.Top:= ThumbRect.Top;
ThumbRect.Bottom:= ThumbRect.Top+ DiagonalHeight;
Triangle[0]:= Point(ThumbRect.right-1, ThumbRect.Top+1);
Triangle[1]:= Point(ThumbRect.Right-1, ThumbRect.Bottom);
Triangle[2]:= Point(ThumbRect.Left+1, ThumbRect.Bottom);
Pen.Color:=ThumbColor;
Brush.Color:= ThumbColor;
Polygon(Triangle);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
BF_DIAGONAL_ENDTOPRIGHT);
ThumbRect.Top:= ATop + DiagonalHeight;
ThumbRect.Bottom:=ATop + TrackButton.ClientHeight;
Triangle[0]:= Point(ThumbRect.Right-1, ThumbRect.Top+1);
Triangle[1]:= Point(ThumbRect.Right-1, ThumbRect.Bottom-1);
Triangle[2]:= Point(ThumbRect.Left+1, ThumbRect.Top+1);
Pen.Color:=ThumbColor;
Brush.Color:= ThumbColor;
Polygon(Triangle);
DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
{BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMRIGHT);//BOTTOMLEFT);
end;
end;
end;
end;
procedure TfcTrackBar.DrawTickText(TickValue: Double; TickText: string; ARect: TRect);
var Flags: integer;
DoDefault: boolean;
begin
DoDefault:= True;
if Assigned(FOnDrawTickText) then
FOnDrawTickText(self, TickValue, TickText, ARect, DoDefault);
if DoDefault then
begin
SetBkMode(Canvas.Handle, windows.TRANSPARENT);
Flags:= DT_NOPREFIX;
ARect.Right:= fcMax(ARect.Right, ARect.Left + Canvas.TextWidth(TickText));
ARect.Bottom:= fcMax(ARect.Bottom, ARect.Top + Canvas.TextHeight(TickText));
DrawText(Canvas.Handle, PChar(TickText), length(TickText), ARect, Flags);
end;
end;
procedure TfcTrackBar.Paint;
var r: TRect;
valstr: string;
RulerRect: TRect;
Current: Double;
FocusRect: TRect;
{$ifdef fcUseThemeManager}
Details: TThemedElementDetails;
{$endif}
TickCount: integer;
DrawFlags: Integer;
procedure DrawTick(Current: Double; TickCount: integer);
var x,y: integer;
DisplayStr: string;
ARect: TRect;
DrawTickLabel: boolean;
begin
if TextAttributes.TickDisplayFormat = '' then
DisplayStr:= floattostr(Current)
else DisplayStr := FormatFloat(TextAttributes.TickDisplayFormat, Current);
DrawTickLabel:= (TextAttributes.TickLabelFrequency >0) and ((TickCount mod TextAttributes.TickLabelFrequency) = 0);
with Canvas do begin
if orientation = trfcHorizontal then
begin
if TickMarks in [tmfcBottomRight, tmfcBoth] then
begin
x:= RulerRect.Left + ValToPixel(Current);
y:= RulerRect.Bottom + FThumbTrackSeparation + 3;
MoveTo(x, y);
LineTo(x, y+4);
if DrawTickLabel then
begin
ARect:= Rect(x - TextWidth(DisplayStr) div 2, y+6,
x + TextWidth(DisplayStr) div 2, y + 6 + TextHeight('A'));
DrawTickText(Current, DisplayStr, ARect);
end
end;
if TickMarks in [tmfcTopLeft, tmfcBoth] then
begin
x:= RulerRect.Left + ValToPixel(Current);
y:= RulerRect.Top - 6 - 4;
MoveTo(x, y+4);
LineTo(x, y);
if DrawTickLabel and (TickMarks <> tmfcBoth) then
begin
ARect:= Rect(x-TextWidth(DisplayStr) div 2,
y - TextHeight('A')-1,
x + TextWidth(DisplayStr) div 2, y-1);
DrawTickText(Current, DisplayStr, ARect);
end
end;
end
else begin
if TickMarks in [tmfcBottomRight, tmfcBoth] then
begin
x:= RulerRect.Right + FThumbTrackSeparation + 3;
y:= RulerRect.Top + ValToPixel(Current);
MoveTo(x, y);
LineTo(x+4, y);
if DrawTickLabel then
begin
ARect:= Rect(x+6, y - TextHeight('A') div 2,
x+6+TextWidth(DisplayStr), y + TextHeight('A') div 2);
DrawTickText(Current, DisplayStr, ARect);
end
end;
if TickMarks in [tmfcTopLeft, tmfcBoth] then
begin
x:= RulerRect.Left - 6 - 4;
y:= RulerRect.Top + ValToPixel(Current);
MoveTo(x+4, y);
LineTo(x, y);
if DrawTickLabel and (TickMarks <> tmfcBoth) then
begin
ARect:= Rect(x-TextWidth(DisplayStr)-1, y - TextHeight('A') div 2,
x-1, y + TextHeight('A') div 2);
DrawTickText(Current, DisplayStr, ARect);
end
end
end;
end;
end;
begin
inherited Paint;
RulerRect:= GetTrackBarRect;
if orientation = trfcHorizontal then
begin
RulerRect.Left:= RulerRect.Left - TrackButton.Width div 2 + 1;
RulerRect.Right:= RulerRect.Right + (TrackButton.Width div 2 - 1);
end
else begin
RulerRect.Top:= RulerRect.Top - TrackButton.Height div 2 + 1;
RulerRect.Bottom:= RulerRect.Bottom + (TrackButton.Height div 2 - 1);
end;
if fcUseThemes(self) then
begin
{$ifdef fcUseThemeManager}
Details := ThemeServices.GetElementDetails(ttbTrack);
ThemeServices.DrawElement(Canvas.Handle, Details, RulerRect);
{$endif}
end
else begin
with Canvas do begin
{ Draw the ruler }
Brush.Color:= TrackColor;
FillRect(RulerRect);
Pen.Color:= clBtnShadow;
MoveTo(RulerRect.Left-1, RulerRect.Bottom);
LineTo(RulerRect.Left-1, RulerRect.Top);
LineTo(RulerRect.Right, RulerRect.Top);
Pen.Color:= clGray;
MoveTo(RulerRect.Left, RulerRect.Bottom);
LineTo(RulerRect.Left, RulerRect.Top+1);
LineTo(RulerRect.Right, RulerRect.Top + 1);
Pen.Color:= clBtnFace;
MoveTo(RulerRect.Left-1, RulerRect.Bottom-1);
LineTo(RulerRect.Right, RulerRect.Bottom-1);
LineTo(RulerRect.Right, RulerRect.Top);
Pen.Color:= clBtnHighlight;
MoveTo(RulerRect.Left-1, RulerRect.Bottom);
LineTo(RulerRect.Right+1, RulerRect.Bottom);
LineTo(RulerRect.Right+1, RulerRect.Top);
end;
end;
if FTrackPartialFillColor<>clNone then
begin
r:= GetTrackBarRect;
if orientation = trfcHorizontal then
begin
r.Left:= r.Left - TrackButton.Width div 2 + 1;
r.Right:= r.Right + (TrackButton.Width div 2 - 1);
end
else begin
r.Top:= r.Top - TrackButton.Height div 2 + 1;
r.Bottom:= r.Bottom + (TrackButton.Height div 2 - 1);
end;
InflateRect(r, -1, -1);
if Orientation = trfcVertical then
begin
if Inverted then
begin
r.top:= r.Top + ValToPixel(Position);
end
else begin
r.Bottom:= GetTrackBarRect.Top + ValToPixel(Position);
end;
end
else begin
if Inverted then
begin
r.left:= GetTrackBarRect.Left + ValToPixel(Position);
end
else begin
r.Right:= GetTrackBarRect.Left + ValToPixel(Position);
end
end;
Canvas.Brush.Color:= FTrackPartialFillColor;
Canvas.FillRect(r);
end;
if (SelStart<>0) and (SelEnd>SelStart) then
begin
if fcUseThemes(self) and false then
begin
end
else begin
r:= GetTrackBarRect;
InflateRect(r, -1, -1);
if Orientation = trfcVertical then
begin
if Inverted then
begin
r.top:= r.Top + ValToPixel(SelStart);
r.Bottom:= GetTrackBarRect.Top + ValToPixel(SelEnd);
end
else begin
r.top:= GetTrackBarRect.Top + ValToPixel(SelStart);
r.Bottom:= GetTrackBarRect.Top + ValToPixel(SelEnd);
end;
end
else begin
if Inverted then
begin
r.left:= GetTrackBarRect.Left + ValToPixel(SelStart);
r.Right:= GetTrackBarRect.Left + ValToPixel(selEnd);
end
else begin
r.left:= GetTrackBarRect.Left + ValToPixel(SelStart);
r.Right:= GetTrackBarRect.Left + ValToPixel(selEnd);
end
end;
Canvas.Brush.Color:= clHighlight;
Canvas.FillRect(r);
end
end;
{ Now draw all the tics }
with Canvas do begin
Current:=Min;
TickCount:= 0;
RulerRect:= GetTrackBarRect;
if TickStyle<>tsfcNone then
begin
While current<=Max do begin
Pen.color:= clBlack;
if TickStyle=tsfcManual then
begin
if Current=min then DrawTick(Current, TickCount);
end
else begin
DrawTick(Current, TickCount);
end;
Current:= Current + Frequency;
TickCount:= TickCount + 1;
end;
if TickStyle=tsfcManual then DrawTick(Current - Frequency, TickCount);
end
end;
if Focused and not (csPaintCopy in ControlState) then
begin
FocusRect:= ClientRect;
InflateRect(FocusRect, -2, -2);
DrawFocusRect(Canvas, FocusRect);
end;
if orientation = trfcHorizontal then
PaintThumb(
GetTrackBarRect.Left + ValToPixel(Position) - (TrackButton.Width div 2), TrackButton.top)
else
PaintThumb(
TrackButton.Left, GetTrackBarRect.Top + ValToPixel(Position) - (TrackButton.Height div 2));
if TextAttributes.Showtext then
begin
if TextAttributes.DisplayFormat = '' then
valstr:= floattostr(GetDBValue)
// Str(Position, valStr)
else ValStr := FormatFloat(TextAttributes.DisplayFormat, GetDBValue);
// valstr:= floattostr(position);
r:= ClientRect;
Canvas.Font.Assign(Font);
if TextAttributes.Position = tbtLeft then
begin
r.left:= TextAttributes.OffsetX + 3;
r.top:= RulerRect.Top + ((RulerRect.Bottom - RulerRect.Top) - Canvas.TextHeight(valstr)) div 2;
r.top:= r.top + TextAttributes.OffsetY;
end
else if TextAttributes.Position = tbtRight then
begin
r.left:= ClientWidth - Canvas.TextWidth(valstr) - TextAttributes.OffsetX - 3;
r.top:= RulerRect.Top + ((RulerRect.Bottom - RulerRect.Top) - Canvas.TextHeight(valstr)) div 2;
r.top:= r.top + TextAttributes.OffsetY;
end
else if TextAttributes.Position = tbtTop then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -