destructor TALScrollingText.Destroy;
begin
Timer.Free;
BackBitmap.Free;
DrawnBitmap.Free;
WholeBitmap.Free;
inherited;
end;
procedure TALScrollingText.Loaded;
begin
inherited;
InvalidateEverything;
if fTextDirection = tdLeftToRight then
Position := -(WholeBitmap.Width - Width)
else
Position := 0;
end;
procedure TALScrollingText.OnTimer(Sender: TObject);
begin
if Enabled then
begin
if fTextDirection = tdLeftToRight then
begin
Inc(Position, fPixelJump);
if Position >= 0 then
Position := -WholeBitmap.Width + Width;
end
else
begin
Dec(Position, fPixelJump);
if Position <= -(WholeBitmap.Width - Width) then
Position := 0;
end;
end;
Paint;
end;
procedure TALScrollingText.Paint;
begin
inherited;
procedure TALScrollingText.InvalidateEverything;
var
i: Integer;
begin
with WholeBitmap do
begin
Canvas.Brush.Color := fBackgroundColor;
Canvas.FillRect(Rect(0, 0, Width, Height));
Canvas.Font := Self.Font;
Width := WholeBitmap.Canvas.TextWidth(fText) + (2 * Self.Width);
Height := Self.Height;
if (Self.Font.Color = clGreen) or (fBackgroundColor = clGreen) then
begin
TransparentColor := clRed;
Canvas.Font.Color := clRed;
end
else
begin
TransparentColor := clGreen;
Canvas.Font.Color := clGreen;
end;
if fLayout = tlTop then
Canvas.TextOut(Self.Width, 0, fText)
else if fLayout = tlCenter then
Canvas.TextOut(Self.Width, (Self.Height div 2) - (Canvas.TextHeight(fText) div 2), fText)
else
Canvas.TextOut(Self.Width, Self.Height - Canvas.TextHeight(fText), fText);
end;
with BackBitmap do
begin
Width := Self.Width;
Height := Self.Height;
Canvas.Brush.Color := Self.Font.Color;
Canvas.FillRect(Rect(0, 0, Self.Width, Self.Height));
if fEdgeFadeWidth > 0 then
begin
for i := 0 to fEdgeFadeWidth-1 do
begin
Canvas.Pen.Color := CalcColorIndex(fBackgroundColor, Self.Font.Color, fEdgeFadeWidth, i+1);
Canvas.MoveTo(i, 0);
Canvas.LineTo(i, Self.Height);
Canvas.MoveTo(Width-i-1, 0);
Canvas.LineTo(Width-i-1, Self.Height);
end;
end;
end;
procedure TALScrollingText.CMFontChanged(var Msg: TMessage);
begin
inherited;
InvalidateEverything;
Msg.Result := 1;
end;
procedure TALScrollingText.Resize;
begin
inherited;
InvalidateEverything;
end;
procedure TALScrollingText.SetBackgroundColor(const Value: TColor);
begin
if fBackgroundColor <> Value then
begin
fBackgroundColor := Value;
InvalidateEverything;
end;
end;
procedure TALScrollingText.SetSpeed(const Value: Integer);
begin
if fSpeed <> Value then
begin
fSpeed := Value;
Timer.Interval := Value;
end;
end;
procedure TALScrollingText.SetText(const Value: String);
begin
if fText <> Value then
begin
fText := Value;
InvalidateEverything;
end;
end;
procedure TALScrollingText.SetEdgeFadeWidth(const Value: Integer);
begin
if fEdgeFadeWidth <> Value then
begin
fEdgeFadeWidth := Value;
InvalidateEverything;
end;
end;
procedure TALScrollingText.SetLayout(const Value: TTextLayout);
begin
if fLayout <> Value then
begin
fLayout := Value;
InvalidateEverything;
end;
end;
procedure TALScrollingText.SetTextDirection(const Value: TTextDirection);
begin
if fTextDirection <> Value then
begin
fTextDirection := Value;
if Value = tdLeftToRight then
Position := -(WholeBitmap.Width - Width)
else
Position := 0;
InvalidateEverything;
end;
end;
function TALScrollingText.CalcColorIndex(StartColor, EndColor: TColor; Steps, ColorIndex: Integer): TColor;
var
BeginRGBValue: Array[0..2] of Byte;
RGBDifference: Array[0..2] of Integer;
Red, Green, Blue: Byte;
NumColors: Integer;
begin
if (ColorIndex < 1) or (ColorIndex > Steps) then
raise ERangeError.Create('ColorIndex can''t be less than 1 or greater than ' + IntToStr(Steps));
NumColors := Steps;
Dec(ColorIndex);
BeginRGBValue[0] := GetRValue(ColorToRGB(StartColor));
BeginRGBValue[1] := GetGValue(ColorToRGB(StartColor));
BeginRGBValue[2] := GetBValue(ColorToRGB(StartColor));
RGBDifference[0] := GetRValue(ColorToRGB(EndColor)) - BeginRGBValue[0];
RGBDifference[1] := GetGValue(ColorToRGB(EndColor)) - BeginRGBValue[1];
RGBDifference[2] := GetBValue(ColorToRGB(EndColor)) - BeginRGBValue[2];
// Calculate the bands color
Red := BeginRGBValue[0] + MulDiv(ColorIndex, RGBDifference[0], NumColors - 1);
Green := BeginRGBValue[1] + MulDiv(ColorIndex, RGBDifference[1], NumColors - 1);
Blue := BeginRGBValue[2] + MulDiv(ColorIndex, RGBDifference[2], NumColors - 1);
Result := RGB(Red, Green, Blue);
end;