From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序

有一天在微信里看见了微软的Fluent Design系统(腾讯翻译为浸流设计系统)界面设计的一张图片,觉得非常好看,顿时想,这么好看的界面,如果能是一个屏保该有多好。这样的话,用户坐在电脑前也不会忍心动它,从而保证我们坐在电脑前也能好好学习了。

环境介绍:
编译环境: VS2017 C# .NETFramework4.5.2 -> 要改成.NETFramework3.5.0
操作系统: Windows7

技能需求:
软件技能: 最好有过的C#或者Java编写经验,以免遇到问题了都不知道怎么办。

想自己编写一个屏保程序是一晚上的事情,当时觉得自己应该有这个能力去开发一个简单的小程序了,于是第二天就开始动手了,百度上搜了一些网站,都是字多图少类的,看不下去,最终找到了一个看起来结构比较清晰的,而且有代码,便依照着那个代码开始了我的屏保程序。(网址如下)
http://www.cr173.com/html/7989_1.html

Step1: 打开VS,新建一个C#应用程序


From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第1张图片

 
Step2: 设置窗体属性


From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第2张图片 From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第3张图片

文字说明:
窗体:
Name属性       ->    screen、
Text属性        ->    空、
BackColor属性     ->    Black、
Size属性        ->    (800, 600)、
ControlBox、MaximizeBox、MinimizeBox、ShowInTaskbar属性 -> false、
FormBorderStyle属性  ->    None
 
 
Step3: 添加控件(需要使用工具箱,工具箱可以通过“视图”点开)


From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第4张图片 From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第5张图片 From .1:从屏保到Win平台开发 - 一个可运行的C#屏保程序_第6张图片

往窗体上添加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。

在之后的文章,会进一步解决缠绕在我心头的问题。如果大家发现了文章中的什么问题,或者有什么看法,都可以在下面评论区留言,小生会虚心听取建议。

你可能感兴趣的:(从屏保到Win开发)