气泡屏幕保护制作要点:1 窗口要全屏置顶 2 模拟气泡的滚动和粘滞效果 3 支持快捷键ESC退出大致就是这3个要点了,其他还有一些细节我们在程序中根据需要再看,OK,开工!
首先是全屏置顶,因为是屏幕保护嘛,这个简单,在窗体的属性设置里把FormBorderStyle设置为none表示无边框,把ShowInTaskbar设置为false表示不在任务栏出现,最后一个把WindowState设置为Maximized表示最大化即可,当然可以设置TopMost为true让窗口置顶,不过这个不是绝对的,如果有其他窗口也使用TopMost的话会让我们失去焦点,所以我们要注册一个快捷键让程序可以退出!
模拟气泡我们可以用Graphics类中的DrawEllipse方法来画一个圆,当然这个圆我们可以指定不同的颜色和大小,这里重点讲一下怎么模拟粘滞效果!
所谓粘滞效果相信大家到知道,胶体大家都见过吧?就是类似胶体那种有弹性并且可以在改变形状后回复原型的那种效果,当然这里要想模拟这个效果只能说是稍微类似,DrawEllipse方法中最后两个参数表示圆的大小,我们可以在这里做文章,由于循环的速度很快,我们只要动态改变圆的大小就可以产生类似粘滞的效果,当然这个改变大小的参数不能太大,否则就无效了!
我们在onpaint事件中写入如下代码来绘制一些圆:
01.Random ra = new Random(); //初始化随机数
02. bmp = new Bitmap(ClientSize.Width,ClientSize.Height, e.Graphics);
03. Graphics bmpGraphics = Graphics.FromImage(bmp);
04. // 绘制圆形
05. for (int i=1;i<=13;i++)//这里绘制13个圆形
06. {
07. bmpGraphics.DrawEllipse(new Pen(Color.FromName(colours[i]),2),//根据事先定义好的颜色绘制不同颜色的圆
08. ballarray[i, 1], ballarray[i, 2], 70+ra.Next(1, 10), 70+ra.Next(1, 10));
09. //注意上面的最后两个参数利用随机数产生粘滞效果
10. }
11. e.Graphics.DrawImageUnscaled(bmp, 0, 0);
12. bmpGraphics.Dispose();
13. bmp.Dispose();//这里是非托管的垃圾回收机制,避免产生内存溢出
这样,通过以上代码就可以绘制出一些不同颜色的具有粘滞效果的圆来模拟气泡
下面是注册系统热键,有个API函数RegisterHotKey可以完成系统快捷键的注册,使用他之前我们要先引用一个系统的DLL文件:USER32.DLL,然后对这个RegisterHotKey函数进行一下声明:
1.[DllImport("user32.dll")]//引用USER32.DLL
2.public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk); //声明函数原型
由于引用了一个DLL文件,我们不要忘了在文件头加入DLLImport的类声明using System.Runtime.InteropServices;然后在Form1的构造函数中来注册一个系统热键,这里我们注册ESC:RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.Escape); 通过以上步骤,我们就可以注册一个或多个系统热键,但是,注册系统热键后我们还不能立即使用,因为我们在程序中还无法对这个消息进行响应,我们重载一下默认的WndProc过程来响应我们的热键消息:
01.protected override void WndProc(ref Message m)//注意是保护类型的过程
02. {
03. const int WM_HOTKEY = 0x0312;
04. }
05. if (m.Msg == WM_HOTKEY & & m.WParam.ToInt32() == 247696411) //判断热键消息是不是我们设置的
06. {
07. Application.Exit();//如果消息等于我们的热键消息,程序退出
08. }
09. base.WndProc(ref m);//其他消息返回做默认处理
好了,通过以上一些步骤,我们就基本完成了这个屏幕保护程序的要点设计,其他的详细过程可以参考源码,程序运行的时候背景是透明的,这个也不难实现
1.this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
2.this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
TransparencyKey可以让窗体的某个颜色透明显示,我们只要把窗体的颜色和TransparencyKey的颜色设置一致就可以了,这里我设置的是粉红,注意最好设置的颜色是窗体所没有的,否则一旦匹配将会以透明显示!