[Delphi] 폼이 모니터 한 가운데 있는 경우 자연스럽게 왼쪽으로 이동시키기

- 05-26
- 2,628 회
- 0 건
폼이 현재 모니터 화면의 중앙(±50픽셀) 근처에 있을 때만, 왼쪽으로 200픽셀 부드럽게 이동시켜줍니다.
이동은 여러 단계로 나누어 점점 느려지는 애니메이션(ease-out) 효과를 주기 때문에 자연스럽게 폼이 미끄러지듯 움직이는 것을 볼 수 있습니다.
중앙에 있을 때만 작동하도록 범위 체크를 하며, 마지막에는 남은 거리를 정확히 이동해서 항상 200픽셀만큼 이동이 보장됩니다.
[code]
uses system.math;
procedure TForm1.MoveLeftSmooth;
const
MoveAmount = 200; // 전체 이동 거리
Steps = 40; // 단계 수
CenterMargin = 50; // 중앙 허용 픽셀 범위
var
CenterLeft, CenterTop: Integer;
i, IntDelta: Integer;
Progress, Eased, LastEased, RemainMove: Double;
begin
// 1. 중앙 여부 판별
CenterLeft := Monitor.WorkareaRect.Left + ((Monitor.WorkareaRect.Width - Width) div 2);
CenterTop := Monitor.WorkareaRect.Top + ((Monitor.WorkareaRect.Height - Height) div 2);
if (Abs(Left - CenterLeft) > CenterMargin) or (Abs(Top - CenterTop) > CenterMargin) then Exit;
// 2. 부드럽게 왼쪽 이동
LastEased := 0;
RemainMove := 0;
for I := 1 to Steps do
begin
Progress := I / Steps;
Eased := MoveAmount * (1 - Power(1 - Progress, 3)); // ease-out cubic
RemainMove := RemainMove + (Eased - LastEased);
IntDelta := Trunc(RemainMove);
if IntDelta > 0 then
begin
Left := Left - IntDelta;
RemainMove := RemainMove - IntDelta;
end;
LastEased := Eased;
Application.ProcessMessages;
Sleep(8);
end;
// 3. 남은 픽셀 보정
IntDelta := Round(MoveAmount - (Eased));
if IntDelta > 0 then
Left := Left - IntDelta;
end;
[/code]
이동은 여러 단계로 나누어 점점 느려지는 애니메이션(ease-out) 효과를 주기 때문에 자연스럽게 폼이 미끄러지듯 움직이는 것을 볼 수 있습니다.
중앙에 있을 때만 작동하도록 범위 체크를 하며, 마지막에는 남은 거리를 정확히 이동해서 항상 200픽셀만큼 이동이 보장됩니다.
[code]
uses system.math;
procedure TForm1.MoveLeftSmooth;
const
MoveAmount = 200; // 전체 이동 거리
Steps = 40; // 단계 수
CenterMargin = 50; // 중앙 허용 픽셀 범위
var
CenterLeft, CenterTop: Integer;
i, IntDelta: Integer;
Progress, Eased, LastEased, RemainMove: Double;
begin
// 1. 중앙 여부 판별
CenterLeft := Monitor.WorkareaRect.Left + ((Monitor.WorkareaRect.Width - Width) div 2);
CenterTop := Monitor.WorkareaRect.Top + ((Monitor.WorkareaRect.Height - Height) div 2);
if (Abs(Left - CenterLeft) > CenterMargin) or (Abs(Top - CenterTop) > CenterMargin) then Exit;
// 2. 부드럽게 왼쪽 이동
LastEased := 0;
RemainMove := 0;
for I := 1 to Steps do
begin
Progress := I / Steps;
Eased := MoveAmount * (1 - Power(1 - Progress, 3)); // ease-out cubic
RemainMove := RemainMove + (Eased - LastEased);
IntDelta := Trunc(RemainMove);
if IntDelta > 0 then
begin
Left := Left - IntDelta;
RemainMove := RemainMove - IntDelta;
end;
LastEased := Eased;
Application.ProcessMessages;
Sleep(8);
end;
// 3. 남은 픽셀 보정
IntDelta := Round(MoveAmount - (Eased));
if IntDelta > 0 then
Left := Left - IntDelta;
end;
[/code]
로그인 후 댓글내용을 입력해주세요