C#实现打造气泡屏幕保护效果

本文主要是介绍C#实现打造气泡屏幕保护效果,首先说一下制作要点:1 窗口要全屏置顶 2 模拟气泡的滚动和粘滞效果 3 支持快捷键ESC退出

大致就是这3个要点了,其他还有一些细节我们在程序中根据需要再看,OK,开工!

首先是全屏置顶,因为是屏幕保护嘛,这个简单,在窗体的属性设置里把FormBorderStyle设置为none表示无边框,把ShowInTaskbar设置为false表示不在任务栏出现,最后一个把WindowState设置为Maximized表示最大化即可,当然可以设置TopMost为true让窗口置顶,不过这个不是绝对的,如果有其他窗口也使用TopMost的话会让我们失去焦点,所以我们要注册一个快捷键让程序可以退出!

模拟气泡我们可以用Graphics类中的DrawEllipse方法来画一个圆,当然这个圆我们可以指定不同的颜色和大小,这里重点讲一下怎么模拟粘滞效果!

所谓粘滞效果相信大家到知道,胶体大家都见过吧?就是类似胶体那种有弹性并且可以在改变形状后回复原型的那种效果,当然这里要想模拟这个效果只能说是稍微类似,DrawEllipse方法中最后两个参数表示圆的大小,我们可以在这里做文章,由于循环的速度很快,我们只要动态改变圆的大小就可以产生类似粘滞的效果,当然这个改变大小的参数不能太大,否则就无效了!

我们在onpaint事件中写入如下代码来绘制一些圆:

Random ra = new Random(); //初始化随机数
   bmp = new Bitmap(ClientSize.Width,ClientSize.Height, e.Graphics);
   Graphics bmpGraphics = Graphics.FromImage(bmp);
   // 绘制圆形
  for (int i=1;i<=13;i++)//这里绘制13个圆形
   {
     bmpGraphics.DrawEllipse(new Pen(Color.FromName(colours[i]),2),//根据事先定义好的颜色绘制不同颜色的圆
      ballarray[i, 1], ballarray[i, 2], 70+ra.Next(1, 10), 70+ra.Next(1, 10));
      //注意上面的最后两个参数利用随机数产生粘滞效果
   }
   e.Graphics.DrawImageUnscaled(bmp, 0, 0);
   bmpGraphics.Dispose();
   bmp.Dispose();//这里是非托管的垃圾回收机制,避免产生内存溢出

这样,通过以上代码就可以绘制出一些不同颜色的具有粘滞效果的圆来模拟气泡

下面是注册系统热键,有个API函数RegisterHotKey可以完成系统快捷键的注册,使用他之前我们要先引用一个系统的DLL文件:USER32.DLL,然后对这个RegisterHotKey函数进行一下声明:

[DllImport("user32.dll")]//引用USER32.DLL
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过程来响应我们的热键消息:

protected override void WndProc(ref Message m)//注意是保护类型的过程
 {
     const int WM_HOTKEY = 0x0312;
 }
    if (m.Msg == WM_HOTKEY & & m.WParam.ToInt32() == 247696411) //判断热键消息是不是我们设置的
       {
        Application.Exit();//如果消息等于我们的热键消息,程序退出
      }
    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)))));

屏幕保护程序代码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
/*
 屏幕保护程序
 使用技术:系统热键,随机数,Graphics类绘制圆形
 编译环境:VisualStudio 2005
 运行要求:安装.net framework 2.0 框架
 其他:使用ESC退出

 说明:由于使用了循环控制图形位移,CPU占用在20%-30%左右
 程序具有自动垃圾回收机制避免造成内存溢出

 2009年3月15日
 */
namespace AnimatBall
{
  /// <summary>
  /// Summary description for Form1.
  /// </summary> 

  public class Form1 : System.Windows.Forms.Form
  { 

    public int[,] ballarray = new int[20,20];
    public string[] colours = new string[16];

    public Bitmap bmp;

    private System.Windows.Forms.Timer timer1;
    private System.ComponentModel.IContainer components;
    [DllImport("user32.dll")]
    public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk); //API
     //重写消息循环

    protected override void WndProc(ref Message m)
     {
       const int WM_HOTKEY = 0x0312;

       if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 247696411) //判断热键
       {
         Application.Exit();
       }

       base.WndProc(ref m);
     }
    public Form1()
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();
      //colours[0]="Red";
      colours[1]="Red";
      colours[2]="Blue";
      colours[3]="Black";
      colours[4]="Yellow";
      colours[5]="Crimson";
      colours[6]="Gold";
      colours[7]="Green";
      colours[8]="Magenta";
      colours[9]="Aquamarine";
      colours[10]="Brown";
      colours[11]="Red";
      colours[12]="DarkBlue";
      colours[13]="Brown";
      colours[14]="Red";
      colours[15]="DarkBlue";
      InitializeComponent();
      RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.Escape); //注册热键
      //
      // TODO: Add any constructor code after InitializeComponent call
      //
    } 

    /// <summary>
    /// Clean up any resources being used.
    /// </summary> 

    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    } 

      #region Windows Form Designer generated code 

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary> 

    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      this.timer1 = new System.Windows.Forms.Timer(this.components);
      this.SuspendLayout();
      //
      // timer1
      //
      this.timer1.Interval = 25;
      this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
      //
      // Form1
      //
      this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
      this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
      this.ClientSize = new System.Drawing.Size(373, 294);
      this.DoubleBuffered = true;
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
      this.Name = "Form1";
      this.ShowInTaskbar = false;
      this.Text = "小焱屏幕保护";
      this.TopMost = true;
      this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
      this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
      this.Load += new System.EventHandler(this.Form1_Load);
      this.ResumeLayout(false);

    }
      #endregion
    /// <summary>
    /// The main entry point for the application.
    /// </summary> 

    [STAThread]
    static void Main()
    {
      Application.Run(new Form1());
    } 

    private void timer1_Tick(object sender, System.EventArgs e)
    {

      for (int i=1;i<=13;i++)
      {
        //add direction vectors to coordinates
        ballarray[i,1] = ballarray[i,1] + ballarray[i,3];
        ballarray[i,2] = ballarray[i,2] + ballarray[i,4];
        //if ball goes of to right
        if ((ballarray[i,1]+50)>=ClientSize.Width)
        {
          ballarray[i,1]=ballarray[i,1]-ballarray[i,3];
          ballarray[i,3]=-ballarray[i,3];
        }
          //if ball goes off bottom
        else if ((ballarray[i,2]+50)>=ClientSize.Height)
        {
          ballarray[i,2]=ballarray[i,2]-ballarray[i,4];
          ballarray[i,4]=-ballarray[i,4];
        }
          //if ball goes off to left
        else if (ballarray[i,1]<=1)
        {
          ballarray[i,1]=ballarray[i,1]-ballarray[i,3];
          ballarray[i,3]=-ballarray[i,3];
        }
          //if ball goes over top
        else if (ballarray[i,2]<=1)
        {
          ballarray[i,2]=ballarray[i,2]-ballarray[i,4];
          ballarray[i,4]=-ballarray[i,4];
        }
      }
      this.Refresh(); //force repaint of window
    }
    //Called from timer event when window needs redrawing
    protected override void OnPaint(PaintEventArgs e)
    {
      Random ra = new Random();
      bmp = new Bitmap(ClientSize.Width,ClientSize.Height, e.Graphics);
      Graphics bmpGraphics = Graphics.FromImage(bmp);
      // draw here
      for (int i=1;i<=13;i++)
      {
        bmpGraphics.DrawEllipse(new Pen(Color.FromName(colours[i]),2),
          ballarray[i, 1], ballarray[i, 2], 70+ra.Next(1, 10), 70+ra.Next(1, 10));//利用随机数产生粘滞效果
      }
      e.Graphics.DrawImageUnscaled(bmp, 0, 0);
      //Draw ellipse acording to mouse coords.

      bmpGraphics.Dispose();
      bmp.Dispose();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
      Random r = new Random();
      //set ball coords and vectors x,y,xv,yv
      for (int i = 1; i <= 13; i++)
      {
        ballarray[i, 1] = +r.Next(10) + 1; //+1 means i lose zero values
        ballarray[i, 2] = +r.Next(10) + 1;

        ballarray[i, 3] = +r.Next(10) + 1;
        ballarray[i, 4] = +r.Next(10) + 1;
      }
      timer1.Start();
    }

  }
}

TransparencyKey可以让窗体的某个颜色透明显示,我们只要把窗体的颜色和TransparencyKey的颜色设置一致就可以了,这里我设置的是粉红,注意最好设置的颜色是窗体所没有的,否则一旦匹配将会以透明显示!

效果如下:

(0)

相关推荐

  • 用vbscript实现修改屏幕保护的等待时间长度

    问: 嗨,Scripting Guy!是否可以使用脚本来修改计算机上屏幕保护的等待时间长度? -- JN 答: 嗨,JN.出于某些原因,Microsoft 的脚本技术在涉及 Windows 设置和组件方面有些不足,例如屏幕保护.墙纸.任务栏和开始菜单等等.您可以使用 WMI(尤其是 Win32_Desktop 类)来读取这些值,但不能使用 Win32_Desktop 类(或是任何等价的类或对象)来修改这些值.为什么呢?老实说,我们也不知道: 幸好,这些值大都存储在 Windows 注册表中,而只

  • javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)

    功能描述:打开一个网站的网页,过5分钟不动作,就会锁定页面,隐藏内容容器,显示一个容器用于输入密码,输入正确的密码来解锁.锁定后即使用户刷新页面,还是保留原来的状态.如已经锁定的,需要继续锁定,否则显示内容.   示例代码如下,通过document.onmouseover来实现多少分钟没有动作,使用计时器来实现. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o

  • C#实现打造气泡屏幕保护效果

    本文主要是介绍C#实现打造气泡屏幕保护效果,首先说一下制作要点:1 窗口要全屏置顶 2 模拟气泡的滚动和粘滞效果 3 支持快捷键ESC退出 大致就是这3个要点了,其他还有一些细节我们在程序中根据需要再看,OK,开工! 首先是全屏置顶,因为是屏幕保护嘛,这个简单,在窗体的属性设置里把FormBorderStyle设置为none表示无边框,把ShowInTaskbar设置为false表示不在任务栏出现,最后一个把WindowState设置为Maximized表示最大化即可,当然可以设置TopMost

  • 用vbs实现配置无人登录计算机时使用的屏幕保护程序

    问: 您好,脚本专家!我最近下载了你们的"脚本中心"屏幕保护程序,当有人登录计算机时,它运行起来棒极了.但是无人登录时,计算机却使用其它屏幕保护程序.如何让计算机在无人登录时也使用"脚本中心"屏幕保护程序? -- RF 答: 您好,RF.您知道,我们遇到过这种情况,您可能在设法欺骗这些老脚本专家们.举个例子来说,我们怎么知道您希望无人登录计算机时运行的屏幕保护程序就是我们的屏幕保护程序?也许您只是奉承脚本专家,好让脚本专家回答您的问题.回答完问题后,您就会把我们甩掉

  • c#制作屏幕保护程序步骤(字幕屏保)

    屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件.但他又是一个比较独特的"exe"文件.下面就来探讨一下,用C#是如何编写屏幕保护的整个过程. 二.C#编写字幕显示屏保程序的关键步骤以及解决方法:(1)设定程序的窗体符合屏幕保护的要求:由于屏幕保护程序就是一个可执行程序,所以在编写屏幕保护程序的时候,首先按照可执行程序来设计.但屏幕保护有自身的特点.譬如:屏幕保护都是充满整个屏幕的,并且没有无边.屏幕保护运行的时候,不能显

  • 利用JS打造黑客代码雨效果

    目录 演示 技术栈 源码 画布 js样式设置 演示 技术栈 js实战我们也写过很多了,其中每次几乎都用到画布,大家知道它的重要性了吧.今天依旧用到它了.不过我们讲过它的用法就不多说了. 这次我们说一下window.onload window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法. window.onload() 通常用于 元素,在页面完全载入后(包括图片.css文件等等)执行脚本代码. 只有一个要执行的函数语法: window

  • vue实现气泡运动撞击效果

    本文实例为大家分享了vue实现气泡运动撞击效果的具体代码,供大家参考,具体内容如下 封装组件 <template>   <ul id="main">     <li v-for="(item, index) in circleData" :key="index" :class="{'active': item.is_latest_sign_user}">       <div>

  • 用vbs记录屏幕保护程序的开始时间和结束时间

    问: 您好,脚本专家!如何记录屏幕保护程序的开始时间和结束时间? -- JS 答: 您好,JS.您知道,一位脚本专家(嘿,谁说"肯定是 Greg"?)年纪大得记得屏幕保护程序刚出现的日子.那时,这类脚本毫无意义.毕竟,屏幕保护程序启动后,每个人都神魂颠倒,从未想过让它结束.事实上,作为计算机支持人员的这位脚本专家首先必须做的一件事就是在每个人的桌面上创建快捷方式,使他们能够随时启动"飞转的小烤炉". 那时人们很容易得到快乐. 啊,但是活在过去没有意义,对吧?在今天的

  • Android使用ViewPager实现屏幕滑动效果

    使用ViewPager实现屏幕滑动 从一个完整的屏幕移动到另一个屏幕的过程被称为屏幕滑动,在安装向导.幻灯片中应用广泛.下面介绍如何利用Android Support库的ViewPager来实现屏幕滑动. 创建View 创建一个在之后作为fragment的内容的布局文件,下面的例子中包含一个Textview,用来展示一些文字. <!-- fragment_screen_slide_page.xml --> <ScrollView xmlns:android="http://sc

  • jquery跟随屏幕滚动效果的实现代码

    我们在很多网站看到,当我们滚动网页时,网页内的广告或某个小区域并不会消失,而是浮动在屏幕的某个地方,特别是一些局域广告.那么这是怎么实现的呢?本文将引用乌徒帮的跟随屏幕滚动代码,对此效果做详解. 一.原始代码 下面是乌徒帮的跟随屏幕滚动代码,它的作用域为乌徒帮网页两侧的边栏,以及双击屏幕后的右侧隐藏栏. var $catalogueOffsetTop = $('aside#catalogue').offset().top; var $archiveOffestTop = $('aside#arc

随机推荐