Исчезание формы Windows Forms в C#

Форма Windows Forms в C# может быть запрограммирована с эффектом исчезания и исчезать с помощью параметров прозрачности. Действительный код C# не слишком сложный, просто необходимо его соответствующим образом структурировать.

Появление и исчезание выполняется с помощью простого цикла свойства Opacity формы:

for (double i = this.Opacity; i <= 1; i += fadeRate)
{
ChangeOpacity(i);
}
if (this.Opacity != 1.00)
ChangeOpacity(1.00);

Почему код C# вызывает ChangeOpacity вместо простой установки числа для этого свойства Opacity? Если коротко, то потому, что приложение использует многопотоковость.

Многопотоковость

Для исключения конфликта с остальными элементами пользовательского интерфейса необходима многопотоковость. Многопотоковость будет выполнять эффекты исчезания и появления в отдельном потоке из оставшейся части интерфейса C#, чтобы исключить странное поведение.

Что может привести к проблемам? Функции исчезания C# и форма Windows Forms будут в отдельных потоках. Последняя версия платформы .Net Framework не разрешает межпотоковые вызовы.

Чтобы обойти это, можно использовать делегаты. Приведенная выше функция C# использует вызов ChangeOpacity, который будет создавать делегата для доступа к свойству Opacity формы в том же потоке:

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;
     }
}

Обратите внимание, что можно вызвать любую нужную функцию C# и передать любые нужные параметры.

События мыши в C#

Потребуются только два события мыши в C#, MouseEnter и MouseLeave. Чтобы вызвать функции появления (FadeIn) и исчезания (FadeOut) C#, необходим следующий простой исходный код:

ThreadStart fadeInStart = new ThreadStart(FadeIn);
fadeIn = new Thread(fadeInStart);
fadeIn.Start();

Конечно, для функции исчезания (FadeOut) следует заменить часть FadeIn.

Существует одна небольшая проблема. Событие MouseLeave формы будет порождаться, когда курсор "покинет" форму C#, "входя" в другой элемент управления, даже если он находится в той же форме. Простой способ обойти это состоит в добавлении следующего кода C# в начале события MouseLeave:

if (this.Bounds.Contains(Cursor.Position)) return;

Исключение переполнения

Краткое замечание: требуется обеспечить остановку всех работающих вызовов функций появления и исчезания в C# перед вызовом еще одной. Это необходимо делать, чтобы исключить переполнение стека, что может привести к сбою приложения. Просто воспользуйтесь вызовом Abort C#.

Проверьте, как происходит исчезание формы, загрузив пример исходного кода C#.