最近翻看以前的學習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下載。