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






4.61/5 (24投票s)
2006年12月27日
2分钟阅读

121760

4409
本文档解释了如何创建一个在桌面飘雪的应用程序。
引言
我上周发表了文章 桌面飘雪!,收到了很多关于 C# 版本应用程序的请求。因此,C# 版本来了。
每当圣诞节假期到来时,我都会想到桌面上的有趣玩具。
所以,我决定创建我自己的应用程序,让雪在桌面上飘落在其他窗口上。从互联网上可以看到,许多作者使用不同的方式来显示桌面上的雪花飘落。我尝试让我的应用程序尽可能简单,并决定开发一个带有许多子雪花窗口的系统托盘应用程序。我认为这种方法最简单,但对于内存和视频使用有一些限制。
通用步骤
- 创建主窗口。
我们需要创建一个隐藏的窗体,并防止同时打开多个“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());
- 安装系统托盘图标。
如果你需要有关如何执行此操作的逐步说明,请阅读 Tom Archer 的文章“C# 技巧:将你的 C# 应用程序放在系统托盘中”。
- 创建雪花数组。
在这个应用程序中,每个雪花都作为非模态窗口窗体创建,并具有其自己的、依赖于计时器的移动函数。
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(); } }
- 从位图中创建雪花形状。
在运行窗口之前,我们需要创建一个雪花区域,该区域将窗口显示为真正的雪花。我使用了 Weiye Chen 的 文章中的“
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(); }
这个例子可以通过在桌面上绘制雪堆,以及显示圣诞老人、雪人和其它物体来扩展。你可以试验雪花的位置(顶部、最顶层、底部)、雪花的数量、下落速度等。
无论如何,我希望其他人发现这段代码对圣诞节假期有用。请随时报告错误、问题或要求。