有一天在微信里看见了微软的Fluent Design系统(腾讯翻译为浸流设计系统)界面设计的一张图片,觉得非常好看,顿时想,这么好看的界面,如果能是一个屏保该有多好。这样的话,用户坐在电脑前也不会忍心动它,从而保证我们坐在电脑前也能好好学习了。
环境介绍:
编译环境: VS2017 C# .NETFramework4.5.2 -> 要改成.NETFramework3.5.0
操作系统: Windows7
技能需求:
软件技能: 最好有过的C#或者Java编写经验,以免遇到问题了都不知道怎么办。
想自己编写一个屏保程序是一晚上的事情,当时觉得自己应该有这个能力去开发一个简单的小程序了,于是第二天就开始动手了,百度上搜了一些网站,都是字多图少类的,看不下去,最终找到了一个看起来结构比较清晰的,而且有代码,便依照着那个代码开始了我的屏保程序。(网址如下)
http://www.cr173.com/html/7989_1.html
Step1: 打开VS,新建一个C#应用程序
Step2: 设置窗体属性
文字说明:
窗体:
Name属性 -> screen、
Text属性 -> 空、
BackColor属性 -> Black、
Size属性 -> (800, 600)、
ControlBox、MaximizeBox、MinimizeBox、ShowInTaskbar属性 -> false、
FormBorderStyle属性 -> None
Step3: 添加控件(需要使用工具箱,工具箱可以通过“视图”点开)
往窗体上添加Label控件、PictureBox控件、Timer控件各一个。
将Label控件的Name设置为word、Text属性设置为空;
将PictureBox控件的Name设置为picture1、Image设置为一个预知图片;
将Timer控件的Name设置为timerSaver、Enabled 属性设为true、Interval属性设为5。
Step4: 添加程序
在代码片内添加下列代码,我这儿是在Form1.cs内添加代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace WindowsProtect
{
public partial class Screen : Form
{
private IContainer components;
private int iSpeed = 2;
private string str = "福建南纺股份公司计算机中心";
private Font TextStringFont = new Font("宋体", 10, FontStyle.Bold);
private Color TextStringcolor = Color.Yellow;
private int iDistance;
private int ixStart = 0;
private int iyStart = 0;
private int speed;
private int x1, y1;
private PictureBox picture1; //图形控件
private System.Windows.Forms.Timer timerSaver; //计时器控件
private Label word; //文本显示控件
int width1, height1;
public Screen()
{
// Windows 窗体设计器支持所必需的
InitializeComponent();
word.Font = TextStringFont;
word.ForeColor = TextStringcolor;
Cursor.Hide(); //隐藏光标
}
/* 清理所有正在使用的资源。*/
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null) { components.Dispose(); }
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/* 设计器支持所需的方法 - 不要使用代码编辑器修改 */
private void InitializeComponent() //初始化程序中使用到的组件
{
this.components = new Container();
ComponentResourceManager resources =
new ComponentResourceManager(typeof(Screen));
this.word = new Label();
this.timerSaver =
new System.Windows.Forms.Timer(this.components);
this.picture1 = new PictureBox();
((ISupportInitialize)(this.picture1)).BeginInit();
this.SuspendLayout();
//
// word
//
this.word.ForeColor = Color.Yellow;
this.word.Location = new Point(832, 10);
this.word.Name = "word";
this.word.Size = new Size(224, 21);
this.word.TabIndex = 0;
this.word.Visible = false;
//
// timerSaver
//
this.timerSaver.Enabled = true;
this.timerSaver.Interval = 5;
this.timerSaver.Tick += new EventHandler(this.timerSaver_Tick);
//
// picture1
//
this.picture1.Image =
((Image)(resources.GetObject("picture1.Image")));
this.picture1.Location = new Point(1067, 771);
this.picture1.Name = "picture1";
this.picture1.Size = new Size(405, 288);
this.picture1.SizeMode = PictureBoxSizeMode.StretchImage;
this.picture1.TabIndex = 1;
this.picture1.TabStop = false;
//
// Screen
//
this.AutoScaleBaseSize = new Size(8, 18);
this.BackColor = Color.Black;
this.ClientSize = new Size(800, 600);
this.ControlBox = false;
this.Controls.Add(this.picture1);
this.Controls.Add(this.word);
this.FormBorderStyle = FormBorderStyle.None;
this.KeyPreview = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Screen";
this.ShowInTaskbar = false;
this.StartPosition = FormStartPosition.Manual;
this.WindowState = FormWindowState.Maximized;
this.Load += new EventHandler(this.Form1_Load);
this.KeyDown += new KeyEventHandler(this.screen_KeyDown);
this.MouseDown += new MouseEventHandler(this.screen_MouseDown);
this.MouseMove += new MouseEventHandler(this.screen_MouseMove);
((ISupportInitialize)(this.picture1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/* 应用程序的主入口点。 */
[STAThread]
static void main(string[] args)
{
if (args.Length == 1)
if (args[0].Substring(0, 2).Equals("/c"))
{
MessageBox.Show("没有设置项功能", "C# Screen Saver");
Application.Exit();
}
else if (args[0] == "/s")
{
Application.Run(new Screen());
}
else if (args[0] == "/a")
{
MessageBox.Show("没有口令功能", "C# Screen saver");
Application.Exit();
}
else
{
Application.Run(new Screen());
}
}
private void Form1_Load(object sender, EventArgs e)
{
speed = 0;
Rectangle ssWorkArea = System.Windows.Forms.Screen.GetWorkingArea(this);
/* 屏幕显示区域 */
width1 = ssWorkArea.Width; //屏幕宽度
height1 = ssWorkArea.Height; //屏幕高度
}
private void timerSaver_Tick(object sender, EventArgs e)
{
word.Visible = true;
word.Text = str;
word.Height = word.Font.Height;
word.Width = word.Text.Length * (int)word.Font.Size * 2;
PlayScreenSaver();
}
private void PlayScreenSaver() //自定义函数
{
/* 下面设置文本显示框的位置坐标 */
word.Location = new Point(width1 - iDistance, word.Location.Y);
word.Visible = true; //设置为可见
iDistance += iSpeed;
if (word.Location.X <= -(word.Width))
{
iDistance = 0;
if (word.Location.Y == 0)
{
word.Location =
new Point(word.Location.X, height1 / 2);
}
else if (word.Location.Y == height1 / 2)
{
word.Location =
new Point(word.Location.X, height1 - word.Height);
}
else
{
word.Location = new Point(word.Location.X, 0);
}
}
//下面是计算图片框移动坐标
speed++;
if (speed <= 2 * height1)
{
x1 = Math.Abs(width1 - speed);
y1 = Math.Abs(height1 - speed);
}
else if (speed > 2 * height1 && speed <= 2 * width1)
{
x1 = Math.Abs(width1 - speed);
y1 = Math.Abs(height1 -
(speed - speed / height1 * height1));
}
else if (speed > 2 * width1 && speed <= 3 * height1)
{
x1 = Math.Abs(width1 - (speed - speed / width1 * width1));
y1 = Math.Abs(height1 -
(speed - speed / height1 * height1));
}
else if (speed > 3 * height1 && speed < 4 * height1)
{
x1 = Math.Abs(width1 - (speed - speed / width1 * width1));
y1 = Math.Abs(speed - speed / height1 * height1);
}
else if (speed >= 4 * height1 && speed < 5 * height1)
{
x1 = Math.Abs(speed - speed / width1 * width1);
y1 = Math.Abs(height1 -
(speed - speed / height1 * height1));
}
else if (speed >= 5 * height1 && speed < 4 * width1)
{
x1 = Math.Abs(speed - speed / width1 * width1);
y1 = Math.Abs(speed - speed / height1 * height1);
}
else if (speed >= 4 * width1 && speed < 6 * height1)
{
x1 = Math.Abs(width1 - (speed - speed / width1 * width1));
y1 = Math.Abs(speed - speed / height1 * height1);
}
else if (speed >= 6 * height1 && speed < 5 * width1)
{
x1 = Math.Abs(width1 - (speed - speed / width1 * width1));
y1 = Math.Abs(height1 -
(speed - speed / height1 * height1));
}
else if (speed >= 5 * width1 && speed < 7 * height1)
{
x1 = Math.Abs(speed - speed / width1 * width1);
y1 = Math.Abs(height1 -
(speed - speed / height1 * height1));
}
else if (speed >= 7 * height1 && speed < 6 * width1)
{
x1 = Math.Abs(speed - speed / width1 * width1);
y1 = Math.Abs(speed - speed / height1 * height1);
}
if (speed == 6 * width1) speed = 0;
picture1.Location = new Point(x1, y1);
}
private void StopScreenSaver() //停止屏幕保护程序运行
{
Cursor.Show();
timerSaver.Enabled = false;
Application.Exit();
}
private void screen_MouseMove(object sender, MouseEventArgs e)
{
if (ixStart == 0 && iyStart == 0)
{
ixStart = e.X;
iyStart = e.Y;
return;
}
else if (e.X != ixStart || e.Y != iyStart)
StopScreenSaver();
}
private void screen_MouseDown(object sender, MouseEventArgs e)
{
StopScreenSaver();
}
private void screen_KeyDown(object sender, KeyEventArgs e)
{
StopScreenSaver();
}
}
}
按F5或者点击“运行”就能看见程序运行的样子了。在工程目录内找到相应的.exe文件,后缀名更改成.scr文件,再将其放入C:\Windows\system32目录下即可。
后话:
大家应该是都能成功运行出程序了,而这个屏保搭建在.NETFramework 3.5.0环境下,因为我之前用.NETFramework 4.5.2最后运行失败,才知道系统不支持这个框架,如下文:
默认情况下,.NET Framework 3.5 在 Windows 7 上是启用的,所以只有在之前禁用此功能的情况下才会出现此错误。若要重新启用 .NET Framework 3.5,请按照下列步骤操作:
从“开始”菜单中选择“控制面板”。
在“控制面板”中,选择“程序”(或者,如果您不是使用默认的分类视图,请选择“程序和功能”)。
在“程序和功能”中,选择“打开或关闭 Windows 功能”以打开“Windows 功能”对话框。
在“Windows 功能”中,选中“Microsoft .NET Framework 3.5.1”复选框,然后选择“确定”。
再按上述模式更改后,在此运行改程序,电脑管家提示其会更新注册表,这应该是软件执行时发现缺少了动态链接库,因此会强制加上,但是看起来还是很恐怖。我都忘了我在设置Fliqlo的时候有没有出现一样的情况了。
而且最重要的是,现在的屏保程序并没有想象中的那么好看,而是——特别Low。
在之后的文章,会进一步解决缠绕在我心头的问题。如果大家发现了文章中的什么问题,或者有什么看法,都可以在下面评论区留言,小生会虚心听取建议。