十年前俺还在东北实习的时候。那时候是个技术宅,正在学习C#绘图,反射等。冰天雪地的东北,周末无聊做了个雪花屏保,像下面这个样子。
用到的知识有面向对象、绘图、随机函数、定时器等。
先定义一个雪花片对象,用来存一个雪花片的坐标和实现飘动和绘制逻辑。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace 雪花屏保
{
public class Flake
{
Random random = new Random((int)DateTime.Now.Ticks);
public static int windWidth;
private int speedInY ;
private int speedInX=0;
private int inY=0;
private int inX;
int i = 0;
static Image image = Image.FromFile("7.jpg");
/// <summary>
/// Y坐标
/// </summary>
public int InY
{
get
{
inY += SpeedInY;
return inY;
}
}
/// <summary>
/// X坐标
/// </summary>
public int InX
{
get
{
inX += SpeedInX;
return inX;
}
}
/// <summary>
/// 竖直方向速度
/// </summary>
private int SpeedInY
{
get { return speedInY; }
}
/// <summary>
/// 水平方向速度
/// </summary>
private int SpeedInX
{
get
{
if ((i % (random.Next(10)+2)) == 0)
{
i++;
return speedInX=Convert.ToInt32(random.Next(2) * Math.Pow(-1, random.Next(2)));
}
else
{
i++;
return speedInX;
}
}
}
public Flake()
{
speedInY = random.Next(2)+2;
inX = random.Next(windWidth);
}
public void Draw(Graphics pDC)
{
pDC.DrawImage(image, InX, InY,20,20);
}
}
}
然后就到定时器里随机在顶部加雪花片,和让每片雪花飘落绘制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace 雪花屏保
{
public partial class MySnowFlake : Form
{
Point point;
private const int SW_HIDE = 0;//API参数表示隐藏窗口
private const int SW_SHOW = 5;//API参数表示用当前的大小和位置显示窗口
[DllImportAttribute("user32.dll")]
private static extern int FindWindow(string ClassName, string WindowName);
[DllImport("user32.dll")]
private static extern int ShowWindow(int handle, int cmdShow);
bool isNew = true;
List<Flake> flakeList=new List <Flake>();
public MySnowFlake()
{
InitializeComponent();
}
private void MySnowFlake_Load(object sender, EventArgs e)
{
Cursor.Hide();
//this.ShowInTaskbar = false;//使程序不在任务栏里显示
ShowWindow(FindWindow("Shell_TrayWnd", null), SW_HIDE);
Flake.windWidth = this.ClientRectangle.Width;
}
private void MySnowFlake_MouseMove(object sender, MouseEventArgs e)
{
if (isNew)
{
point = e.Location;
isNew = false;
}
if (System.Math.Abs(point.X - e.X) > 10 || System.Math.Abs(point.Y - e.Y) > 10)
{
Cursor.Show();
ShowWindow(FindWindow("Shell_TrayWnd", null), SW_SHOW);
Application.Exit();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
Random random = new Random((int)DateTime.Now.Ticks);
int n = random.Next(1);
for (int i = 0; i <= n; i++)
{
Flake flake = new Flake();
flakeList.Add(flake);
}
Bitmap bitMap = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
Graphics g = Graphics.FromImage(bitMap);
g.Clear(this.BackColor);
List<Flake> flakeList1 = new List<Flake>();
foreach (Flake fl in flakeList)
{
if (!(fl.InX < 0 || fl.InX > this.ClientRectangle.Width || fl.InY > this.ClientRectangle.Height))
{
flakeList1.Add(fl);
fl.Draw(g);
}
}
flakeList = null;
flakeList = new List<Flake>();
flakeList = flakeList1;
flakeList1 = null;
Graphics pDC = this.CreateGraphics();
pDC.DrawImage(bitMap,0,0);
pDC.Dispose();
g.Dispose();
bitMap.Dispose();
}
}
}
代码不复杂,比较有意思额。