안녕하십니까..
프로젝트를 진행하다
..한군데 막히는 부분이 생겨서
이렇게 글을 올려 도움을 받을까 합니다..
막히는 부분은 이미지위에 Text을 흐르게 하는
부분입니다. text를 흐르게하는 effect는 leftToRight면 좋겠는데요..
단색으로 text를 흐르게는 성공을 했는데..
여러 다른색을 써서 다른 text가 함께 흐르는
부분을 하지 못해서 이렇게 조언을 부탁합니다.
혹시 이런 기능을 가진 component를 어디서 구할수
있는지도..
만일 도움이 될 말씀이 계시면..
email 이나 질문에 대한 답변을 부탁드립니다.
> 안녕하십니까..
> 프로젝트를 진행하다
> ..한군데 막히는 부분이 생겨서
> 이렇게 글을 올려 도움을 받을까 합니다..
>
> 막히는 부분은 이미지위에 Text을 흐르게 하는
> 부분입니다. text를 흐르게하는 effect는 leftToRight면 좋겠는데요..
> 단색으로 text를 흐르게는 성공을 했는데..
> 여러 다른색을 써서 다른 text가 함께 흐르는
> 부분을 하지 못해서 이렇게 조언을 부탁합니다.
>
> 혹시 이런 기능을 가진 component를 어디서 구할수
> 있는지도..
>
> 만일 도움이 될 말씀이 계시면..
> email 이나 질문에 대한 답변을 부탁드립니다.
>
>
>
>
그 콤포넌트의 소스 이옵니다.
unit MoveText;
interface
uses
Windows, SysUtils, Messages, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TAlignment = (taCenter, taLeftJustify, taRightJustify);
TTextStyle = (tsNormal, tsRaised, tsLowered, tsShaddow);
TMoveDirection = (mdStatic, mdRightToLeft, mdLeftToRight, mdTopToBottom, mdBottomToTop);
TCustomMoveText = class(TGraphicControl)
private
FAlignment: TAlignment;
FTextStyle: TTextStyle;
FMoveDirection: TMoveDirection;
FTimer: TTimer;
FItems: TStringList;
FColor: TColor;
FContinuous: Boolean;
FFont: TFont;
FOnBegin, FOnStep, FOnEnd: TNotifyEvent;
FSteps, FSpeed, FDepth, LineHi, FCurrentStep, FTextWidth,
FTextHeight, XPos, YPos: Integer;
procedure SetAlignment(Value: TAlignment);
procedure SetContinuous(Value: Boolean);
procedure SetItems(Value: TStringList);
procedure DataChanged;
procedure SetTextStyle(Value: TTextStyle);
procedure SetDirection(Value: TMoveDirection);
procedure SetSteps(Value: Integer);
procedure SetSpeed(Value: Integer);
procedure SetColor(Value: TColor);
procedure SetFont(Value: TFont);
procedure SetDepth(Value: Integer);
procedure SetSizeParams;
procedure FontChanged(Sender: TObject);
procedure DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
protected
procedure Paint; override;
procedure TimerTick(Sender: TObject);
property Alignment: TAlignment read FAlignment write SetAlignment;
property Depth: Integer read FDepth write SetDepth default 1;
property MoveDirection: TMoveDirection read FMoveDirection
write SetDirection default mdRightToLeft;
property Items: TStringList read FItems write SetItems;
property OnBegin: TNotifyEvent read FOnBegin write FOnBegin;
property OnStep: TNotifyEvent read FOnStep write FOnStep;
property OnEnd: TNotifyEvent read FOnEnd write FOnEnd;
public
property CurrentStep: Integer read FCurrentStep;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReverseDirection;
procedure MoveStart(StartingStep: Integer);
procedure MoveStop;
published
property TextStyle: TTextStyle read FTextStyle write SetTextStyle default tsNormal;
property Steps: Integer read FSteps write SetSteps default 66;
property Speed: Integer read FSpeed write SetSpeed default 200;
property Color: TColor read FColor write SetColor default clBtnFace;
property Continuous: Boolean read FContinuous write SetContinuous;
property Font: TFont read FFont write SetFont;
end;
// TCustomMoveText의 계승을 받는 TMoveText 객체의 선언
TMoveText = class(TCustomMoveText)
published
property Align;
property Alignment;
property Font;
property MoveDirection;
property ShowHint;
property Speed;
property Steps;
property Visible;
property OnBegin;
property OnStep;
property OnEnd;
property Color;
property Depth;
property Items;
property TextStyle;
property ParentShowHint;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('VCL예제', [TMoveText]);
end;
// 컴포넌트객체의 생성
constructor TCustomMoveText.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csOpaque];
// 기본적으로 움직일 텍스트의 설정
FItems := TStringList.Create;
FItems.Add('텍스트를 움직입니다.');
Width := 200;
Height := 20;
FColor := clBtnFace;
FSteps := 80;
FCurrentStep := 0;
FDepth := 1;
FContinuous := True;
FTextStyle := tsNormal;
FAlignment := taCenter;
// 폰트에 대한 기본설정
FFont := TFont.Create;
with FFont do
begin
Name := '굴림체';
Size := 10;
Color := clBlack;
end;
FFont.OnChange := FontChanged;
// 텍스트를 움직일 타이머의 초기화
FTimer := TTimer.Create(Self);
FSpeed := 100;
with FTimer do
begin
Enabled := False;
OnTimer := TimerTick;
Interval := FSpeed;
end;
FMoveDirection := mdRightToLeft;
// 화면상에서 텍스트를 움직이기을 시작한다.
SetDirection(FMoveDirection);
end;
// 컴포넌트 객체의 해제
destructor TCustomMoveText.Destroy;
begin
FItems.Free;
FTimer.Free;
FFont.Free;
inherited Destroy;
end;
// 텍스트의 내용을 지정한다.
procedure TCustomMoveText.SetItems(Value: TStringList);
begin
if FItems <> Value then
begin
FItems.Assign(Value);
DataChanged;
end;
end;
// 화면에 텍스트를 출력한다.
procedure TCustomMoveText.DoTextOut(ACanvas: TCanvas; X, Y: Integer; AText: string);
var
TextAdjustment: Integer;
begin
with ACanvas do
begin
Font := FFont;
Brush.Style := bsClear;
// 텍스트정렬의 지정
if FAlignment = taCenter then
TextAdjustment := Round((FTextWidth / 2) - (TextWidth(AText) / 2))
else if FAlignment = taRightJustify then
TextAdjustment := Round(FTextWidth - TextWidth(AText))
else TextAdjustment := 0;
// 출력할 텍스트의 스타일지정
case FTextStyle of
tsRaised: begin
Font.Color := clBtnHighlight;
// 음영 효과를 나타내는 텍스트
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnShadow;
// 음영 효과를 나타내는 텍스트
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsLowered: begin
Font.Color := clBtnShadow;
// 음영 효과를 나타내는 텍스트
TextOut(X - FDepth + TextAdjustment, Y - FDepth, AText);
Font.Color := clBtnHighlight;
// 음영 효과를 나타내는 텍스트
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
tsShaddow: begin
Font.Color := clBtnShadow;
// 음영 효과를 나타내는 텍스트
TextOut(X + FDepth + TextAdjustment, Y + FDepth, AText);
end;
end;
Font.Color := FFont.Color;
// 메인 텍스트
TextOut(X + TextAdjustment, Y, AText);
end;
end;
// 텍스트를 그려준다.
procedure TCustomMoveText.Paint;
var
TmpBmp: TBitMap;
StartXPos, StartYPos, I: Integer;
PercentDone: Double;
begin
SetSizeParams;
TmpBmp := TBitMap.Create;
try
TmpBmp.Width := Width;
TmpBmp.Height := Height;
with TmpBmp.Canvas do
begin
Font := FFont;
Brush.Color := FColor;
Brush.Style := bsSolid;
FillRect(ClipRect);
end;
if FTextWidth >= Width then
XPos := 0
else
XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then
YPos := 0
else
YPos := (Height - FTextHeight) div 2;
if csDesigning in ComponentState then
PercentDone := 0.5
else
PercentDone := FCurrentStep / FSteps;
// 텍스트가 움직이는 방향을 지정한다.
case FMoveDirection of
mdRightToLeft: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) *
(1 - PercentDone)) - FTextWidth;
end;
mdLeftToRight: begin
StartYPos := YPos;
StartXPos := Round((FTextWidth + Width) *
PercentDone) - FTextWidth;
end;
mdBottomToTop: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) *
(1 - PercentDone)) - FTextHeight;
end;
mdTopToBottom: begin
StartXPos := XPos;
StartYPos := Round((FTextHeight + Height) *
PercentDone) - FTextHeight;
end;
else // 텍스트가 정지해 있으면
begin
StartXPos := XPos;
StartYPos := YPos;
end
end;
I := 0;
// 출력될 텍스트가 있으면
while I < FItems.Count do
begin
DoTextOut(TmpBmp.Canvas, StartXPos, StartYPos,
FItems.Strings[I]);
Inc(StartYPos, LineHi);
Inc(I);
end;
Canvas.Draw(0, 0, TmpBmp);
finally
TmpBmp.Free;
end;
end;
// 텍스트의 각종 세부데이터 설정
procedure TCustomMoveText.SetSizeParams;
var
S: String;
I, SWidth: Integer;
Metrics: TTextMetric;
begin
// 텍스트의 굴곡 설정
with Canvas do
begin
Font := FFont;
GetTextMetrics(Handle, Metrics);
LineHi := Metrics.tmHeight + Metrics.tmInternalLeading;
if FTextStyle in [tsRaised, tsLowered] then
LineHi := LineHi + 2 * FDepth
else if FTextStyle in [tsShaddow] then
LineHi := LineHi + FDepth;
end;
FTextWidth := 0;
I := 0;
while I < FItems.Count do
begin
S := FItems.Strings[I];
SWidth := Canvas.TextWidth(S);
if FTextStyle in [tsRaised, tsLowered] then
SWidth := SWidth + 2 * FDepth
else if FTextStyle in [tsShaddow] then
SWidth := SWidth + FDepth;
if FTextWidth < SWidth then
FTextWidth := SWidth;
Inc(I);
end;
FTextHeight := LineHi * FItems.Count;
if FTextWidth >= Width then
XPos := 0
else
XPos := (Width - FTextWidth) div 2;
if FTextHeight >= Height then
YPos := 0
else
YPos := (Height - FTextHeight) div 2;
end;
// 텍스트가 움직일것인가 정지할 것인가를 지정한다.
procedure TCustomMoveText.SetContinuous(Value: Boolean);
begin
if FContinuous <> Value then
begin
FContinuous := Value;
if FMoveDirection <> mdStatic then
MoveStart(FCurrentStep);
end;
end;
// 움직이는 텍스트가 이동할 값의 지정
procedure TCustomMoveText.SetSteps(Value: Integer);
begin
if FSteps <> Value then
begin
FSteps := Value;
// 디자인시에 는 다시그린다.
if csDesigning in ComponentState then
Invalidate;
end;
end;
// 텍스트의 이동속도를 지정한다.
procedure TCustomMoveText.SetSpeed(Value: Integer);
begin
if FSpeed <> Value then
begin
if Value > 1000 then Value := 1000
else if Value < 1 then Value := 1;
FSpeed := Value;
if FTimer <> nil then FTimer.Interval := FSpeed;
end;
end;
//텍스트의 색깔을 지정한다.
procedure TCustomMoveText.SetColor(Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
DataChanged;
end;
end;
// 텍스트의 폰트가 변경되면
procedure TCustomMoveText.FontChanged(Sender: TObject);
begin
DataChanged;
end;
// 텍스트의 폰트를 지정한다.
procedure TCustomMoveText.SetFont(Value: TFont);
begin
if FFont <> Value then
begin
FFont.Assign(Value);
DataChanged;
end;
end;
// 텍스트의 움직임을 취소한다.
procedure TCustomMoveText.MoveStop;
begin
FTimer.Enabled := False;
end;
// 움직이는 텍스트의 방향을 반전시킨다.
procedure TCustomMoveText.ReverseDirection;
begin
if FMoveDirection = mdStatic then Exit;
FCurrentStep := FSteps - FCurrentStep;
case FMoveDirection of
mdLeftToRight: FMoveDirection := mdRightToLeft;
mdRightToLeft: FMoveDirection := mdLeftToRight;
mdTopToBottom: FMoveDirection := mdBottomToTop;
mdBottomToTop: FMoveDirection := mdTopToBottom;
end;
end;
// 타이머를 조절한다.
procedure TCustomMoveText.TimerTick(Sender: TObject);
begin
if not FTimer.Enabled then Exit;
if (FCurrentStep = 0) and Assigned(FOnBegin) then
FOnBegin(Self);
Inc(FCurrentStep);
Paint;
if Assigned(FOnStep) then
FOnStep(Self);
if FCurrentStep > FSteps then
begin
FTimer.Enabled := False;
if Assigned(FOnEnd) then
FOnEnd(Self);
FCurrentStep := 0;
if FContinuous then
MoveStart(FCurrentStep);
end;
end;
// 지정된 텍스트 정보가 변경되면
procedure TCustomMoveText.DataChanged;
begin
SetSizeParams;
Invalidate;
end;
// 텍스트의 스타일을 변경한다.
procedure TCustomMoveText.SetTextStyle(Value: TTextStyle);
begin
if FTextStyle <> Value then
begin
FTextStyle := Value;
DataChanged;
end;
end;
// 텍스트가 움직이는 위치를 지정한다.
procedure TCustomMoveText.SetDirection(Value: TMoveDirection);
begin
if FMoveDirection <> Value then
FMoveDirection := Value;
if FMoveDirection = mdStatic then
MoveStop
else
MoveStart(FCurrentStep);
end;
// 텍스트의 정렬상태를 지정한다.
procedure TCustomMoveText.SetAlignment(Value: TAlignment);
begin
if FAlignment <> Value then
begin
FAlignment := Value;
DataChanged;
end;
end;
// 텍스트의 굴곡을 지정한다.
procedure TCustomMoveText.SetDepth(Value: Integer);
begin
if FDepth <> Value then
begin
FDepth := Value;
DataChanged;
end;
end;
// 텍스트의 이동을 시작한다.
procedure TCustomMoveText.MoveStart(StartingStep: Integer);
begin
if FTimer.Enabled then Exit;
if (StartingStep >= 0) and (StartingStep <= FSteps) then
FCurrentStep := StartingStep;
FTimer.Enabled := True;
end;
end.
조규춘 올림....