65.9K
CodeProject 正在变化。 阅读更多。
Home

让雪花飘落在您的桌面上!C# 版本

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.61/5 (24投票s)

2006年12月27日

2分钟阅读

viewsIcon

121760

downloadIcon

4409

本文档解释了如何创建一个在桌面飘雪的应用程序。

FallingSnow

引言

我上周发表了文章 桌面飘雪!,收到了很多关于 C# 版本应用程序的请求。因此,C# 版本来了。

每当圣诞节假期到来时,我都会想到桌面上的有趣玩具。

在互联网上搜索,你可以很容易地找到许多适合任何场合(包括圣诞节)的精彩桌面礼物。不幸的是,我找不到任何此类桌面动画的源代码或开源示例。

所以,我决定创建我自己的应用程序,让雪在桌面上飘落在其他窗口上。从互联网上可以看到,许多作者使用不同的方式来显示桌面上的雪花飘落。我尝试让我的应用程序尽可能简单,并决定开发一个带有许多子雪花窗口的系统托盘应用程序。我认为这种方法最简单,但对于内存和视频使用有一些限制。

通用步骤

  1. 创建主窗口。

    我们需要创建一个隐藏的窗体,并防止同时打开多个“Snow”窗口。我使用了 Vasudevan Deepak Kumar 的文章“将应用程序限制为单个实例”中的一段代码。以下代码片段展示了如何做到这一点

    using System.Threading;
    ...
    private static Mutex m_Mutex;
    ...
    m_Mutex = new Mutex(true, "SnowFallMutex");
    
    if (m_Mutex.WaitOne(0, false))
         Application.Run(new MainForm());
  2. 安装系统托盘图标。

    如果你需要有关如何执行此操作的逐步说明,请阅读 Tom Archer 的文章“C# 技巧:将你的 C# 应用程序放在系统托盘中”。

  3. 创建雪花数组。

    在这个应用程序中,每个雪花都作为非模态窗口窗体创建,并具有其自己的、依赖于计时器的移动函数。

    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();
        }
    }
    
  4. 从位图中创建雪花形状。

    在运行窗口之前,我们需要创建一个雪花区域,该区域将窗口显示为真正的雪花。我使用了 Weiye Chen 的 文章中的“BitmapRegion.CreateControlRegion”函数。

  5. 最后一步:启动计时器并享受。

    最后要做的是启动计时器,看看雪花是如何移动的。我使用了下面一个非常简单的算法,但它足以显示桌面上的雪花运动。

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

这个例子可以通过在桌面上绘制雪堆,以及显示圣诞老人、雪人和其它物体来扩展。你可以试验雪花的位置(顶部、最顶层、底部)、雪花的数量、下落速度等。

无论如何,我希望其他人发现这段代码对圣诞节假期有用。请随时报告错误、问题或要求。

© . All rights reserved.