Падающий снег на Рабочем столе

В этой статье объясняется, как создать приложение, с помощью которого на Рабочем столе будут падать снежинки.

Когда приходят новогодние праздники, хочется написать игрушку для рабочего стола. Поэтому, мы напишем программу с эффектом падающих снежинок на Рабочем столе. Программа будет очень простой насколько это возможно.

Для этого необходимо проделать следующие шаги

Сначала займемся основным окном приложения. Нам нужно создать невидимое окно и предотвратить запуск более чем одной копии программы.


System.Threading;
...
private static Mutex m_Mutex;
...
m_Mutex = new Mutex(true, "SnowFallMutex");

if (m_Mutex.WaitOne(0, false))
     Application.Run(new MainForm());

Далее установим значок в области уведомлений. Для для нас не составит проблемы.

Теперь займемся снежинками. Для начала создадим массив снежинок. В нашем приложении каждая снежинка создается как немодальная форма со своей зависимой от таймера функцией падения.


private void OnLoad(object sender, EventArgs e)
{
    Rectangle rcWorkArea = Screen.PrimaryScreen.WorkingArea;
    int nScreenWidth = rcWorkArea.Width;

    int nTimer = 5;
    int nPosX = 0;

    Random r = new Random();
    for (int i = 0; i < 10; i++)
    {
        nTimer = r.Next(50);
        nPosX = r.Next(nScreenWidth);

        FlakeDlg fd = new FlakeDlg(nTimer, nPosX);
        fd.Show();
    }
}

Перед запуском окна нам необходимо создать регион снежинки (flake region), который будет выглядеть как настоящая снежинка на экране. Воспользуемся функцией BitmapRegion.CreateControlRegion.

И последнее - запускаем таймер и смотрим на падающие снежинки. В программе использован очень простой алгоритм, однако он очень эффективен для показа снега на рабочем столе.


private void OnTimer(object sender, EventArgs e)
{
    this.timerMove.Stop();

    m_nCurrentY += 5;
    m_nCounter++;

    Random r = new Random();
    if (m_nCounter == 15)
    {
        if ((r.Next(10) - 5) > 0) m_nIncrement = 1;
        else m_nIncrement = -1;

        m_nCounter = 0;
    }

    m_nCurrentX += m_nIncrement;

    if (m_nCurrentY > m_nScreenHeight)
    {
        m_nCurrentY = 0;
        m_nCurrentX = r.Next(m_nScreenWidth);
        m_nTimer = r.Next(50) + 10;
    }

    this.Left = m_nCurrentX;
    this.Top = m_nCurrentY;

    this.timerMove.Interval = m_nTimer;
    this.timerMove.Start();
}

Вы можете расширить возможности программы, добавив деда мороза и другие объекты. Также поэкспериментуруйте с позициями снежинок, их числом, скоростью падения и так далее.

Скачать пример

Источник: Falling Snow on Your Desktop! The C# Version

Перевод: Василий Котов

Реклама