C#制作简易屏保(转)
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自带的一个屏幕保护。

把窗口的属性设置一下:
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事件。
下面就开始设计算法了,其实也是再简单不过了,随机产生一个点,然后再该处绘制预先准备好的图片。(如果为了好看点,可以设置坐标之间的关系)
private readonly int screenWidth;
private readonly int screenHeight;
private Bitmap bitmap = new Bitmap("ms.bmp");
private Random random = new Random();
private int x = 0;
private int y = 0;增加若干成员变量, 挺有self-documenting的味道,我就不过多解释了,前两个是标志屏幕的宽度和高度,
然后是一个位图对象,存储预先准备的图片,这里是一张bitmap。random是一个随机类对象,用来产生随机点的。再下面分别是产生的随机点的x,y坐标。
构造函数内添加
Rectangle rect = Screen.PrimaryScreen.Bounds;
screenWidth = rect.Width;
screenHeight = rect.Height;第一句话是用来获得整个显示器的边界范围。然后分别把宽度和高度赋值给成员变量。
注:Screen类提供了一些与显示器相关的属性,感兴趣的朋友可以参阅MSDN
下面填补Tick事件
private void timer1_Tick(object sender, EventArgs e)
{
x = random.Next(screenWidth);
y = random.Next(screenHeight);
if (x + bitmap.Width > screenWidth)
{
x = screenWidth - bitmap.Width;
}
if (y + bitmap.Height > screenHeight)
{
y = screenHeight - bitmap.Height;
}
this.Invalidate();
}
上面是获取一个x,y坐标分别不大于显示器的宽度和高度的点。为了美观一点,判断图片是否超过屏幕边界,对x,y进行了一些处理, 不是很难,相信大家都能看懂。最后刷新屏幕,调用paint事件。
我想您一定知道了,对, 在Form的paint事件里面有了一句画图的语句,回答正确!
注: 我在编写程序测试的过程中,发现了一个非常细微也很重要的地方。也正是因为它,才引起了我写这篇文章的欲望。 要指出的是: Graphics类下面有一系列的DrawImage重载函数。
特别关注这两个(我仅仅来出来举例,其他相应的大家自会明白)
和
前者是在指定点绘制物理大小的图片,而后者是在指定点绘制指定缩放大小的图片。
两者有什么不同呢? 给大家看一段话应该就懂了!
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#制作简易屏保(转)的更多相关文章
- C#制作简易屏保
前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...
- WPF 制作 Windows 屏保
分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...
- 一个仿windows泡泡屏保的实现
一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...
- C# 制作屏保(图片位置随机变化)
最近无所事事,闲着无聊,在网上翻看资料时碰巧看到了屏保制作,根据大神的思路也理解到屏保也不是很难.因此根据我自己的理解,动手谢了一个屏保. 首先,打开VS2010创建一个Windows窗体应用程序,名 ...
- wpf 制作播放视频的屏保程序、而且能分屏显示
这个程序用到了WPF里 “visual_Brush”(主要是为了实现分屏显示) , “UserControl” ,这两个知识点: 在屏保状态下播放指定文件夹下的视频,而且能分屏显示: 把编译好的屏保 ...
- Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...
- 仿W8屏保
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linux关闭休眠和屏保模式
本人因为特殊需求,想让某台Linux主机始终显示某个程序,显示器不能关机或者休眠或进入屏保模式. 环境:Ubuntu 11.10 最小化模式安装并安装有轻量级桌面openbox(非gnome).因为X ...
- [AIR] AS3.0设置屏保功能
package com.controls { import flash.desktop.NativeApplication; import flash.events.Event; import fla ...
随机推荐
- HTTPS那些事(一) HTTPS原理
谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传输的一些情况,从回复来看,争议还是有的.随着网络越来越普及,应用越来越广泛,一 ...
- django中使用原生sql
在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...
- PL/SQL 流程控制语句-条件结构,循环结构
条件结构 一.IF-THEN语句 IF-THEN语句是最简单的IF语句. 语法: IF condition THEN Statements END IF; 例子: declare v_score nu ...
- Comparator TreeSet
package study; import java.util.Comparator;import java.util.TreeSet; public class TreeSetTest { publ ...
- du与df为什么有时候会有差异
以下仅为本人理解,非官方! du命令:统计父目录的目录项,若目录项存在,则进行查找 df命令:统计inode节点,根据inode节点存储的块大小进行统计 差异原因: 当一个文件被进程调用后,复制文件到 ...
- pubwin2009服务端 修改系统时间方法
所有操作都是必须的,包括重启. 1.建议操作前全体结账,并交班---不结帐的话, 改完时间会出问题的.2.停止pubwin2009服务端 3.将C:\WINDOWS\system32\driver ...
- BC 65 game
主持人一直某个数字在1到n范围,假设甲乙已经知道,甲先猜乙后,都采用最优策略,主持人说偏大还是偏小,不断缩小范围,问最后乙能会获胜的X的取值的个数. 如果n为奇数,那么仅当x=n/2乙必然获胜,若为奇 ...
- PyQt4.11.3(python3.4+QT4)ui文件生成py文件
最近开始接触学习Python,所以想用QT弄个窗体程序出来玩玩,环境是Python3.4.2.PyQt4.11.3-Py3.4.Win7.用PyQt自带的Designer设计出一个窗体ui文件后,需要 ...
- mysql 在启动时配置文件的查找方式
知识储备: 1.mysql在启动时会去多个地方找它的配置文件,当然啦这些也都是可以从帮助中找到的,问题在于我们要知道怎么找到对应的帮助才行啊 实战: [root@workstudio data]# m ...
- python解释器内建函数002
001.dict 函数来创建字典 #!/usr/bin/python #!coding:utf-8 if __name__ == "__main__": dct001=dict(h ...