WinForm桌面下雪源码

本文介绍了一个使用C#实现的桌面飘雪效果程序。通过定时器和绘图操作,可以在桌面上模拟出下雪的视觉效果。文章提供了完整的源代码,并介绍了如何创建雪花图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; using System.Threading; namespace WindowsApplication30 { public partial class frmDesktopSnow : Form { /// <summary> /// 下雪啦 /// </summary> [DllImport("User32.dll ", EntryPoint = "FindWindow")] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("User32.dll ")] static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string strname); List<Point> SnowPoints = new List<Point>(); List<int> SnowRate = new List<int>(); Bitmap Bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); IntPtr DesktopHandle = IntPtr.Zero; #region public frmDesktopSnow() // 构造函数 /// <summary> /// 构造函数 /// </summary> public frmDesktopSnow() { InitializeComponent(); this.FormBorderStyle = FormBorderStyle.None; BtnStart.Size = new Size(100, 70); BtnClose.Size = new Size(100, 70); BtnStart.Location = new Point(0, 0); BtnClose.Location = new Point(101, 0); BtnStart.Text = "点一下吧"; BtnClose.Text = "关闭"; this.Size = new Size(BtnClose.Right, BtnClose.Bottom); this.Opacity = 0.8; } #endregion #region void SnowTimer_Tick(object sender, EventArgs e) // 下雪计时器事件 /// <summary> /// 下雪计时器事件 /// </summary> /// <param name="sender">计时器本身</param> /// <param name="e">计时器参数</param> void SnowTimer_Tick(object sender, EventArgs e) { Graphics DesktopGraphics = Graphics.FromHwnd(DesktopHandle); String Text = "圣诞快到了,希望大家身体健康!"; if (Convert.ToInt32(SnowTimer.Tag) == 0) DesktopGraphics.DrawString(Text, new Font("宋体", 10), new SolidBrush(Color.Red), new PointF(Screen.PrimaryScreen.Bounds.Width / 2 - 200, Screen.PrimaryScreen.Bounds.Height / 2)); else DesktopGraphics.DrawString(Text, new Font("宋体", 10), new SolidBrush(Color.Green), new PointF(Screen.PrimaryScreen.Bounds.Width / 2 - 200, Screen.PrimaryScreen.Bounds.Height / 2)); SnowTimer.Tag = 1 - Convert.ToInt32(SnowTimer.Tag); for (int i = 0; i < SnowPoints.Count; i++) { DesktopGraphics.DrawImage(Bmp, SnowPoints[i].X, SnowPoints[i].Y, new Rectangle(SnowPoints[i], PbSnow.Size), GraphicsUnit.Pixel); SnowPoints[i] = new Point(SnowPoints[i].X, SnowPoints[i].Y + SnowRate[i]); if (SnowPoints[i].Y > Screen.PrimaryScreen.Bounds.Bottom) SnowPoints[i] = new Point(SnowPoints[i].X, 0); DesktopGraphics.DrawImage(PbSnow.Image, SnowPoints[i]); // PbSnow.Image 小雪花图片 } DesktopGraphics.Dispose(); } #endregion #region void BtnStart_Click(object sender, EventArgs e) // 下雪 /// <summary> /// 开始下雪 /// </summary> /// <param name="sender">按钮本身</param> /// <param name="e">按钮</param> void BtnStart_Click(object sender, EventArgs e) { SnowPoints.Clear(); Random R = new Random(); for (int i = 0; i < 50; i++) { SnowPoints.Add(new Point(R.Next(Screen.PrimaryScreen.Bounds.Width), R.Next(Screen.PrimaryScreen.Bounds.Height))); SnowRate.Add(R.Next(10)); } ShowDesktop(); this.WindowState = FormWindowState.Minimized; Thread.Sleep(500); // 等待桌面完全显示 Graphics G = Graphics.FromImage(Bmp); G.CopyFromScreen(new Point(0, 0), new Point(Screen.PrimaryScreen.Bounds.Left, Screen.PrimaryScreen.Bounds.Top), new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)); G.Dispose(); this.WindowState = FormWindowState.Normal; IntPtr P = FindWindow("Progman", "Program Manager"); P = FindWindowEx(P, IntPtr.Zero, "SHELLDLL_DefView", null); DesktopHandle = FindWindowEx(P, IntPtr.Zero, "SysListView32", null); SnowTimer.Interval = 1; SnowTimer.Enabled = true; // 开始下雪 } #endregion #region void BtnClose_Click(object sender, EventArgs e) // 关闭 /// <summary> /// 关闭 /// </summary> /// <param name="sender">窗口本身</param> /// <param name="e">窗口参数</param> void BtnClose_Click(object sender, EventArgs e) { ShowDesktop(); Close(); } #endregion #region static void ShowDesktop() // 显示桌面 /// <summary> /// 显示桌面 /// </summary> static void ShowDesktop() { Type OleType = Type.GetTypeFromProgID("Shell.Application"); object OleObject = System.Activator.CreateInstance(OleType); OleType.InvokeMember("ToggleDesktop", BindingFlags.InvokeMethod, null, OleObject, null); } #endregion } }
 
小雪花图片用网上有的小雪花矢量图jpg或bmp用photoshop把背景颜色的区域删掉镂空成透明保存成GIF然后导入PbSnow PictureBox控件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值