当前位置:
首页 > 编程开发 > Objective-C编程 >
-
利用c#制作飘动的窗体效果
制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
效果图:
最近翻看以前的学习C#的联系代码,无意之中发现一个很有趣的项目。是一个飘动窗体的效果,运行程序之后,在当前屏幕上会像雪花般飘动很多自定义图标,并且它们就像雪花般轻盈地从屏幕上方飘落到屏幕下方,直到消失。在程序运行过程中,屏幕上会维持一定数目的雪花。在系统托盘区域会有一个图标,点击这个图标,可以退出程序。这个联系代码联系了如何使用不规则窗体和系统托盘控件。
程序中核心部分源代码:
view plaincopy to clipboardprint?
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:图片轮廓类,通过这个类提供的方法得到图片的外围轮廓
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public class BitmapRegion
{
public BitmapRegion()
{ }
public static void CreateControlRegion(Control control, Bitmap bitmap)
{
//如果控件或者图象为空
if (control == null || bitmap == null)
{
return;
}
//将控件设置成图象一样的尺寸
control.Width = bitmap.Width;
control.Height = bitmap.Height;
//如果处理的是一个窗体对象
if (control is System.Windows.Forms.Form)
{
Form form = control as Form;//强制转换为Form实例
//将窗体的尺寸设置成比图片稍微大一点,这样就不用显示窗体边框
form.Width += 15;
form.Height += 35;
//设置窗体无边框
form.FormBorderStyle = FormBorderStyle.None;
//设置窗体背景
form.BackgroundImage = bitmap;
//根据图片计算路径
GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
//应用区域
form.Region = new Region(graphicsPath);
}
//如果处理的是一个按钮对象
else if (control is System.Windows.Forms.Button)
{
Button button = control as Button;//强制转换为Button实例
//不显示文字
button.Text = "";
//当鼠标处在上方时更改光标状态
button.Cursor = Cursors.Hand;
//设置背景图片
button.BackgroundImage = bitmap;
//根据图片计算路径
GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
//应用区域
button.Region = new Region(graphicsPath);
}
}
///
/// 通过逼近的方式扫描图片的轮廓
///
/// 要扫描的图片
///
private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
{
GraphicsPath graphicsPath = new GraphicsPath();
//将图片的(0,0)处的颜色定义为透明色
Color transparentColor = bitmap.GetPixel(0, 0);
//存储发现的第一个不透明的象素的列值(即x坐标),这个值将定义我们扫描不透明区域的边缘
int opaquePixelX = 0;
//从纵向开始
for (int y = 0; y < bitmap.Height; y++)
{
opaquePixelX = 0;
for (int x = 0; x < bitmap.Width; x++)
{
if (bitmap.GetPixel(x, y) != transparentColor)
{
//标记不透明象素的位置
opaquePixelX = x;
//记录当前位置
int nextX = x;
for (nextX = opaquePixelX; nextX < bitmap.Width; nextX++)
{
if (bitmap.GetPixel(nextX, y) == transparentColor)
{
break;
}
}
graphicsPath.AddRectangle(new Rectangle(opaquePixelX, y, nextX - opaquePixelX, 1));
x = nextX;
}
}
}
return graphicsPath;
}
}
}
view plaincopy to clipboardprint?
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:飘动的窗体
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public partial class GoldForm : Form
{
private int currentX;//图片的当前横坐标
private int currentY;//图片的当前纵坐标
private int screenHeight;//屏幕高度
private int screenWidth;//屏幕宽度
private int counter;//图片数量
private int increment;//移动增量
private int interval;//移动时间间隔
private Bitmap bmpFlake = Properties.Resources.snow;
///
/// 构造函数
///
/// 移动间隔
/// 飘动窗体的横坐标
public GoldForm(int interval, int currentX)
{
this.interval = interval + 10;
this.currentX = currentX;
InitializeComponent();
BitmapRegion.CreateControlRegion(this, bmpFlake);
}
private void GoldForm_Load(object sender, EventArgs e)
{
//获取屏幕的工作区域,不包括状态栏
Rectangle rectangleWorkArea = Screen.PrimaryScreen.WorkingArea;
screenHeight = rectangleWorkArea.Height;
screenWidth = rectangleWorkArea.Width;
timerMove.Interval = interval;//设置timer的间隔
this.Left = currentX;//设置窗体的起始横坐标
timerMove.Start();//运行timer
}
//timer的事件
private void timerMove_Tick(object sender, EventArgs e)
{
timerMove.Stop();
currentY += 5;
counter++;
Random random = new Random();
if (counter == 15)
{
if ((random.Next(10) - 5) > 0)
{
increment = 1;
}
else
{
increment = -1;
}
counter = 0;
}
currentX += increment;
if (currentY > screenHeight)
{
currentY = 0;
currentX = random.Next(screenWidth);
interval = random.Next(50,100);
}
//设置窗体位置,相当于移动窗体
this.Location = new Point(currentX, currentY);
timerMove.Interval = interval;
timerMove.Start();
}
}
}
view plaincopy to clipboardprint?
整个程序的源代码请到http://download.csdn.net/source/484535下载。
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:飘动的窗体
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public partial class GoldForm : Form
{
private int currentX;//图片的当前横坐标
private int currentY;//图片的当前纵坐标
private int screenHeight;//屏幕高度
private int screenWidth;//屏幕宽度
private int counter;//图片数量
private int increment;//移动增量
private int interval;//移动时间间隔
private Bitmap bmpFlake = Properties.Resources.snow;
///
/// 构造函数
///
/// 移动间隔
/// 飘动窗体的横坐标
public GoldForm(int interval, int currentX)
{
this.interval = interval + 10;
this.currentX = currentX;
InitializeComponent();
BitmapRegion.CreateControlRegion(this, bmpFlake);
}
private void GoldForm_Load(object sender, EventArgs e)
{
//获取屏幕的工作区域,不包括状态栏
Rectangle rectangleWorkArea = Screen.PrimaryScreen.WorkingArea;
screenHeight = rectangleWorkArea.Height;
screenWidth = rectangleWorkArea.Width;
timerMove.Interval = interval;//设置timer的间隔
this.Left = currentX;//设置窗体的起始横坐标
timerMove.Start();//运行timer
}
//timer的事件
private void timerMove_Tick(object sender, EventArgs e)
{
timerMove.Stop();
currentY += 5;
counter++;
Random random = new Random();
if (counter == 15)
{
if ((random.Next(10) - 5) > 0)
{
increment = 1;
}
else
{
increment = -1;
}
counter = 0;
}
currentX += increment;
if (currentY > screenHeight)
{
currentY = 0;
currentX = random.Next(screenWidth);
interval = random.Next(50,100);
}
//设置窗体位置,相当于移动窗体
this.Location = new Point(currentX, currentY);
timerMove.Interval = interval;
timerMove.Start();
}
}
}
view plaincopy to clipboardprint?
整个程序的源代码请到http://download.csdn.net/source/484535下载。
效果图:
最近翻看以前的学习C#的联系代码,无意之中发现一个很有趣的项目。是一个飘动窗体的效果,运行程序之后,在当前屏幕上会像雪花般飘动很多自定义图标,并且它们就像雪花般轻盈地从屏幕上方飘落到屏幕下方,直到消失。在程序运行过程中,屏幕上会维持一定数目的雪花。在系统托盘区域会有一个图标,点击这个图标,可以退出程序。这个联系代码联系了如何使用不规则窗体和系统托盘控件。
程序中核心部分源代码:
view plaincopy to clipboardprint?
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:图片轮廓类,通过这个类提供的方法得到图片的外围轮廓
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public class BitmapRegion
{
public BitmapRegion()
{ }
public static void CreateControlRegion(Control control, Bitmap bitmap)
{
//如果控件或者图象为空
if (control == null || bitmap == null)
{
return;
}
//将控件设置成图象一样的尺寸
control.Width = bitmap.Width;
control.Height = bitmap.Height;
//如果处理的是一个窗体对象
if (control is System.Windows.Forms.Form)
{
Form form = control as Form;//强制转换为Form实例
//将窗体的尺寸设置成比图片稍微大一点,这样就不用显示窗体边框
form.Width += 15;
form.Height += 35;
//设置窗体无边框
form.FormBorderStyle = FormBorderStyle.None;
//设置窗体背景
form.BackgroundImage = bitmap;
//根据图片计算路径
GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
//应用区域
form.Region = new Region(graphicsPath);
}
//如果处理的是一个按钮对象
else if (control is System.Windows.Forms.Button)
{
Button button = control as Button;//强制转换为Button实例
//不显示文字
button.Text = "";
//当鼠标处在上方时更改光标状态
button.Cursor = Cursors.Hand;
//设置背景图片
button.BackgroundImage = bitmap;
//根据图片计算路径
GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
//应用区域
button.Region = new Region(graphicsPath);
}
}
///
/// 通过逼近的方式扫描图片的轮廓
///
/// 要扫描的图片
///
private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
{
GraphicsPath graphicsPath = new GraphicsPath();
//将图片的(0,0)处的颜色定义为透明色
Color transparentColor = bitmap.GetPixel(0, 0);
//存储发现的第一个不透明的象素的列值(即x坐标),这个值将定义我们扫描不透明区域的边缘
int opaquePixelX = 0;
//从纵向开始
for (int y = 0; y < bitmap.Height; y++)
{
opaquePixelX = 0;
for (int x = 0; x < bitmap.Width; x++)
{
if (bitmap.GetPixel(x, y) != transparentColor)
{
//标记不透明象素的位置
opaquePixelX = x;
//记录当前位置
int nextX = x;
for (nextX = opaquePixelX; nextX < bitmap.Width; nextX++)
{
if (bitmap.GetPixel(nextX, y) == transparentColor)
{
break;
}
}
graphicsPath.AddRectangle(new Rectangle(opaquePixelX, y, nextX - opaquePixelX, 1));
x = nextX;
}
}
}
return graphicsPath;
}
}
}
view plaincopy to clipboardprint?
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:飘动的窗体
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public partial class GoldForm : Form
{
private int currentX;//图片的当前横坐标
private int currentY;//图片的当前纵坐标
private int screenHeight;//屏幕高度
private int screenWidth;//屏幕宽度
private int counter;//图片数量
private int increment;//移动增量
private int interval;//移动时间间隔
private Bitmap bmpFlake = Properties.Resources.snow;
///
/// 构造函数
///
/// 移动间隔
/// 飘动窗体的横坐标
public GoldForm(int interval, int currentX)
{
this.interval = interval + 10;
this.currentX = currentX;
InitializeComponent();
BitmapRegion.CreateControlRegion(this, bmpFlake);
}
private void GoldForm_Load(object sender, EventArgs e)
{
//获取屏幕的工作区域,不包括状态栏
Rectangle rectangleWorkArea = Screen.PrimaryScreen.WorkingArea;
screenHeight = rectangleWorkArea.Height;
screenWidth = rectangleWorkArea.Width;
timerMove.Interval = interval;//设置timer的间隔
this.Left = currentX;//设置窗体的起始横坐标
timerMove.Start();//运行timer
}
//timer的事件
private void timerMove_Tick(object sender, EventArgs e)
{
timerMove.Stop();
currentY += 5;
counter++;
Random random = new Random();
if (counter == 15)
{
if ((random.Next(10) - 5) > 0)
{
increment = 1;
}
else
{
increment = -1;
}
counter = 0;
}
currentX += increment;
if (currentY > screenHeight)
{
currentY = 0;
currentX = random.Next(screenWidth);
interval = random.Next(50,100);
}
//设置窗体位置,相当于移动窗体
this.Location = new Point(currentX, currentY);
timerMove.Interval = interval;
timerMove.Start();
}
}
}
view plaincopy to clipboardprint?
整个程序的源代码请到http://download.csdn.net/source/484535下载。
view plaincopy to clipboardprint?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FallingGold
{
///
/// 说明:飘动的窗体
/// 作者:周公
/// 原创地址:http://blog.csdn.net/zhoufoxcn/archive/2008/06/06/2515753.aspx
///
public partial class GoldForm : Form
{
private int currentX;//图片的当前横坐标
private int currentY;//图片的当前纵坐标
private int screenHeight;//屏幕高度
private int screenWidth;//屏幕宽度
private int counter;//图片数量
private int increment;//移动增量
private int interval;//移动时间间隔
private Bitmap bmpFlake = Properties.Resources.snow;
///
/// 构造函数
///
/// 移动间隔
/// 飘动窗体的横坐标
public GoldForm(int interval, int currentX)
{
this.interval = interval + 10;
this.currentX = currentX;
InitializeComponent();
BitmapRegion.CreateControlRegion(this, bmpFlake);
}
private void GoldForm_Load(object sender, EventArgs e)
{
//获取屏幕的工作区域,不包括状态栏
Rectangle rectangleWorkArea = Screen.PrimaryScreen.WorkingArea;
screenHeight = rectangleWorkArea.Height;
screenWidth = rectangleWorkArea.Width;
timerMove.Interval = interval;//设置timer的间隔
this.Left = currentX;//设置窗体的起始横坐标
timerMove.Start();//运行timer
}
//timer的事件
private void timerMove_Tick(object sender, EventArgs e)
{
timerMove.Stop();
currentY += 5;
counter++;
Random random = new Random();
if (counter == 15)
{
if ((random.Next(10) - 5) > 0)
{
increment = 1;
}
else
{
increment = -1;
}
counter = 0;
}
currentX += increment;
if (currentY > screenHeight)
{
currentY = 0;
currentX = random.Next(screenWidth);
interval = random.Next(50,100);
}
//设置窗体位置,相当于移动窗体
this.Location = new Point(currentX, currentY);
timerMove.Interval = interval;
timerMove.Start();
}
}
}
view plaincopy to clipboardprint?
整个程序的源代码请到http://download.csdn.net/source/484535下载。
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数