본문 바로가기
C++ 200제/코딩 IT 정보

C# 윈폼 프로그래밍, Fading 페이드 효과가 적용된 윈도우 폼

by vicddory 2018. 7. 24.

C# 윈폼 프로그래밍, Fading 페이드 효과가 적용된 윈도우 폼


Fading Form

프로젝트 - 씨샵 윈폼 예제 - fading.zip


C Sharp Form - Fading Form[C# 윈폼 예제] 윈도우 폼 프로그래밍


C# Windows Forms Fade

페이딩 폼을 만드는 그 자체는 어렵지 않습니다. 단지, 제대로 구조화하여 프로그래밍하는 것이 중요합니다.


실제로 프로그램 소스 상에서는 폼의 불투명도를 단순 루프로 쉽게 수행합니다.


1
2
3
4
5
6
7
for (double i = this.Opacity; i <= 1; i += fadeRate)
{
     ChangeOpacity(i);
}
 
if (this.Opacity != 1.00)     
     ChangeOpacity(1.00);
cs


그리고, 코드상에선 단순히 Opacity를 변경하지 않고, ChangeOpacity를 호출하여 사용하는데, 이것은 멀티 스레딩으로 보다 원활한 폼의 페이딩을 위해서입니다.


UI의 나머지 요소들과의 부분적(때로는 큰) 충돌을 피하기 위해서입니다. 멀티 스레딩을 통해서 예기치 못한 상황이나 소소한 충돌들의 예방이 가능합니다.


그럼, 과연 그런 문제는 뭘까요? 단순하게도 지금 사용하려는 페이딩(Fading)과 프로그램 폼 내부의 스레드 간 충돌입니다. 현재의 .Net Framework는 크로스 스레드 호출을 허용하지 않고 있기 때문이죠.


그래서 멀티 스레딩을 위한 델리게이트를 사용합니다.


윈폼 페이드 효과 fading[C# 윈폼 예제] 윈도우 폼 프로그래밍


Multithreading

왜 멀티 스레딩을 하느냐?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private delegate void ChangeOpacityDelegate(double value);
private void ChangeOpacity(double value)
{     
    if (this.InvokeRequired)     
    {          
      ChangeOpacityDelegate del = new ChangeOpacityDelegate(ChangeOpacity);          
      object[] parameters = { value };
    
      this.Invoke(del, value);   
    }     
    else   
    {          
      //Your code goes here, in this case:          
      this.Opacity = value;    
    }
}
cs


이것으로, C#에서 어떤 함수가 위의 코드를 원할 때 원활히 사용할 수 있습니다.


C# Mouse Events

실제 페이드 효과를 주기 위해선 MouseEnter과 MouseLeave란 메서드를 이용합니다. 아래와 같이 호출해 사용하면 됩니다.


1
2
3
ThreadStart fadeInStart = new ThreadStart(FadeIn);
fadeIn = new Thread(fadeInStart);
fadeIn.Start();
cs


그런데, 이렇게 해도 작은 문제가 하나 생깁니다.


마우스 커서가 다른 창으로 이동해서 액션을 취하면, 흐려졌던 폼이 다시 원래 색상으로 돌아오지 않습니다.


그래서 MouseLeave를 사용해서 마우스가 과연 Leave 중인지를 가려내야 합니다.


1
2
if (this.Bounds.Contains(Cursor.Position))
    return;
cs


Avoiding Overflow

FadeIn과 FadeOut에서 오버플로우 문제가 발생할 수 있지만, Abort를 호출함으로써 간단히 해결할 수 있습니다.


C# 윈폼 프로그래밍, Fading 페이드 효과가 적용된 윈도우 폼


댓글