C#制作简易屏保(转)

时间:2023-02-04 12:29:48

C#制作简易屏保[原创]

原始网址: http://www.cnblogs.com/drizzlecrj/archive/2006/10/06/522182.html

2006-10-06 16:25 by 农夫三拳, 4550 阅读, 6 评论, 收藏, 编辑

下载源代码:ScreenSaver.rar初学C#的时候就曾想过写屏幕保护,当时觉得很深奥,摸不着头绪,就放弃了。今日又重新拾起,突然觉得也就是那么一回事,知道了就很简单了。好的,下面就介绍一下如何利用C#制作屏幕保护。
打开Visual Studio.net2005(其他版本也差不多),建立一个windows项目。这次的屏保是模仿Windows XP自带的一个屏幕保护。

C#制作简易屏保(转)

把窗口的属性设置一下:
1.首先把 WindowState 设置为 FormWindowState.Maximized 这样窗口就可以在打开之后呈现最大化的状态。
2.把TopMost 设置为true,这样使得窗口处于最顶层,就是所谓的“永远在前”,相信用过千千静听,金山词霸等软件的朋友应该熟悉。
3.把FormBorderStyle 设置为FormBorderStyle.None ,这样窗口就没有边框,即没有了标题栏,周围的一圈边框。也就省去了一个个去掉MaximizeBox ,MinimizeBox了。
4.把BackColor设置为Color.Black, 这样窗口背景色就变成黑色了
5.ShowInTaskBar 设置为false,(这个步骤可以省去,本身最大化就看不到任务栏了)
其他的属性修改都是多余了,当然把name等等类似改改也行,总之,上面5个(严格的说4个)弄好了,UI方面就设计完毕了。

下面拖动一个timer控件进来,将其Enabled属性设置为true,Interval设置为10000(因为以milliseconds为单位,所以这里设置为10,000,也就是10s)。
加timer控件是为了每隔一定的事件触发一个事件。因此给timer加一个事件,点击Solution Explorer 上面的闪电图标,添加唯一的一个Tick事件。
下面就开始设计算法了,其实也是再简单不过了,随机产生一个点,然后再该处绘制预先准备好的图片。(如果为了好看点,可以设置坐标之间的关系)

C#制作简易屏保(转)        private readonly int screenWidth;
C#制作简易屏保(转)        private readonly int screenHeight;
C#制作简易屏保(转)        private Bitmap bitmap = new Bitmap("ms.bmp");
C#制作简易屏保(转)        private Random random = new Random();
C#制作简易屏保(转)        private int x = 0;
C#制作简易屏保(转)        private int y = 0;

增加若干成员变量, 挺有self-documenting的味道,我就不过多解释了,前两个是标志屏幕的宽度和高度,
然后是一个位图对象,存储预先准备的图片,这里是一张bitmap。random是一个随机类对象,用来产生随机点的。再下面分别是产生的随机点的x,y坐标。
 构造函数内添加

C#制作简易屏保(转)Rectangle rect = Screen.PrimaryScreen.Bounds;
C#制作简易屏保(转)screenWidth = rect.Width;
C#制作简易屏保(转)screenHeight = rect.Height;

第一句话是用来获得整个显示器的边界范围。然后分别把宽度和高度赋值给成员变量。
 注:Screen类提供了一些与显示器相关的属性,感兴趣的朋友可以参阅MSDN
 下面填补Tick事件

C#制作简易屏保(转)private void timer1_Tick(object sender, EventArgs e)
C#制作简易屏保(转)        {
C#制作简易屏保(转)            x = random.Next(screenWidth);
C#制作简易屏保(转)            y = random.Next(screenHeight);
C#制作简易屏保(转)            if (x + bitmap.Width > screenWidth)
C#制作简易屏保(转)            {
C#制作简易屏保(转)                x = screenWidth - bitmap.Width;
C#制作简易屏保(转)            }
C#制作简易屏保(转)            if (y + bitmap.Height > screenHeight)
C#制作简易屏保(转)            {
C#制作简易屏保(转)                y = screenHeight - bitmap.Height;
C#制作简易屏保(转)            }
C#制作简易屏保(转)            this.Invalidate();
C#制作简易屏保(转)        }
C#制作简易屏保(转)

上面是获取一个x,y坐标分别不大于显示器的宽度和高度的点。为了美观一点,判断图片是否超过屏幕边界,对x,y进行了一些处理, 不是很难,相信大家都能看懂。最后刷新屏幕,调用paint事件。
 我想您一定知道了,对, 在Form的paint事件里面有了一句画图的语句,回答正确!

 e.Graphics.DrawImage(bitmap, x, y, bitmap.Width,bitmap.Height);

注: 我在编写程序测试的过程中,发现了一个非常细微也很重要的地方。也正是因为它,才引起了我写这篇文章的欲望。 要指出的是: Graphics类下面有一系列的DrawImage重载函数。
 特别关注这两个(我仅仅来出来举例,其他相应的大家自会明白)

 public void DrawImage( Image image, Point point);

 public void DrawImage(Image image,int x,int y,int width,int height);

前者是在指定点绘制物理大小的图片,而后者是在指定点绘制指定缩放大小的图片。
 两者有什么不同呢? 给大家看一段话应该就懂了!
 
 Image 对象存储像素宽度值及水平分辨率值(每英寸点数)。图像的物理宽度(以英寸为单位)等于像素宽度除以水平分辨率。例如,像素宽度为 216、水平分辨率为 72 点/英寸的图像的物理宽度为 3 英寸。此说明同样适用于像素高度和物理高度。
 
 此方法使用图像的物理大小绘制图像,因此无论显示设备的分辨率(每英寸点数)是多少,图像大小(以英寸为单位)都是正确的。例如,假定图像的像素宽度为
216,水平分辨率为 72 点/英寸。如果调用此方法在分辨率为 96 点/英寸的设备上绘制该图像,则所呈现图像的像素宽度是
(216/72)*96 = 288。
 
 哈哈, 也就是说前者在用图片的物理大小,后者使用指定大小。物理大小在不同的水平分辨率的显示器上显示的始终是图片的真实大小。(注意,bitmap 的width和height返回的大小都是以 pixel(像素)为单位的)。疑云顿时解开了!
 
 最后添加一个程序退出的操作,这里我使用的是键盘按下或者鼠标焦点变换。
 这个不难,略过。
 
 到此为止,把程序执行一下就可以看到预期的效果了。最后把bin/debug或者
 bin/release下的可执行程序后缀改成scr,并拷贝到系统盘Windows的system32下(图片也拷贝进去哦!)
 这样通过桌面属性的屏幕保护程序设置一下就可以投入使用了,是不是很炫呢!赶紧试试吧!
 
 
 
 
 
 程序在 Windows XP SP2 + Visual Studio.net 2005 下编译通过。

后记:
1.笔者发现,在Visual Studio.net2005下面建C#项目的时候有一项就是。是在屏保里面显示Rss内容的。待我研究一阵子再向大家汇报吧。
2.关于图片,拷贝到system32下委实不方便,我们可以使用内嵌资源编译进exe文件里面。下篇文章再介绍了,呵呵,睡觉去咯。

C#制作简易屏保(转)的更多相关文章

  1. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  2. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

  3. C# 制作屏保(图片位置随机变化)

    最近无所事事,闲着无聊,在网上翻看资料时碰巧看到了屏保制作,根据大神的思路也理解到屏保也不是很难.因此根据我自己的理解,动手谢了一个屏保. 首先,打开VS2010创建一个Windows窗体应用程序,名 ...

  4. wpf 制作播放视频的屏保程序、而且能分屏显示

    这个程序用到了WPF里  “visual_Brush”(主要是为了实现分屏显示) , “UserControl” ,这两个知识点: 在屏保状态下播放指定文件夹下的视频,而且能分屏显示: 把编译好的屏保 ...

  5. Tkinter 项目-屏保

    参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...

  6. 仿W8屏保

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Linux关闭休眠和屏保模式

    本人因为特殊需求,想让某台Linux主机始终显示某个程序,显示器不能关机或者休眠或进入屏保模式. 环境:Ubuntu 11.10 最小化模式安装并安装有轻量级桌面openbox(非gnome).因为X ...

  8. &lbrack;AIR&rsqb; AS3&period;0设置屏保功能

    package com.controls { import flash.desktop.NativeApplication; import flash.events.Event; import fla ...

  9. Win XP 如何禁用屏保

    如果你试过 “在桌面空白处点击右键-[属性]-[屏幕保护程序],选择[无],点击[确定]”后,当时是可以去掉屏保.但如果重启计算机或者从待机状态唤醒后,屏保依然会出现,那么你可以试试下面的方法. 首先 ...

随机推荐

  1. Shell编程—定时任务

    应用:定时催收,定时下发,对新增内容入库同步, 时间:凌晨 服务器Reahat Linux: Bash HPUX:kbash? #!/bin/sh #!/bin/bash echo awk #输入重定 ...

  2. &OpenCurlyDoubleQuote;未能加载文件或程序集&OpenCurlyDoubleQuote;EntityFramework&comma; Version&equals;6&period;0&period;0&period;0&comma; Culture&equals;neutral&comma; PublicKeyToken&equals;b77a5c561934e089”

    产生原因: 使用nuget管理程序包,同一个解决方案里面有不同版本的Entity Framework,有可能在不同时间安装不同版本的Entity Framework,所以出现这个问题. 解决方案: 1 ...

  3. JS获取两个日期的月份差

    function getMonthBetween(startDate,endDate){ startDate=new Date(startDate.replace(/-/g,'/')); endDat ...

  4. 看完《Don&&num;39&semi;t make me think》的总结

    寒假在公司实习,然后公司人数比较少,作为一个前端实习生,分工下,就去负责了项目的业务逻辑的梳理以及页面的设计,为了让页面设计的好看,交互性好,便于用户使用,我就快速看了这本薄薄的却很有用的书.书的整体 ...

  5. POJ3267The Cow Lexicon

    http://poj.org/problem?id=3267 题意 : 给你一个message,是给定字符串,然后再给你字典,让你将message与字典中的单词进行匹配,输出要删掉多少字母. 思路 : ...

  6. js架构设计模式——MVC,MVP 和 MVVM 的图示及简单明了的区别说明

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理 ...

  7. 【省选十连测之一】【线段树】【最小生成树之Kruskal】公路建设

    目录 题意 输入格式 输出格式 数据范围 思路 代码 题意 有n个点,m条双向道路,其中第条公路的两个端点是u[i],v[i],费用是c[i]. 现在给出q个询问,每次给定一个L和一个R,要求你只能够 ...

  8. 预热ASP&period;NET MVC 的View

    ASP.NET MVC 的View 预设是Load on Demand(按需加载),也就是说View 第一次要Render 的时候才会去载入跟编译,这个就会造成一个现象,即使Web 应用程式已经完成启 ...

  9. Docker搭建 MySQL 主从复制

    为什么选 Docker 搭建主从复制需要两个以上的MySQL, 使用 Docker 非常方便.如果以前没用过,找个简单的文档看看,熟悉一下命令. 搭建过程 1.下载镜像 docker pull mys ...

  10. Python的索引迭代

    Python中,迭代永远是取出元素本身,而非元素的索引. 对于有序集合,元素确实是有索引的.有的时候,我们确实想在 for 循环中拿到索引,怎么办? 方法是使用 enumerate() 函数: &gt ...