程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 用C#制作飄動的窗體效果

用C#制作飄動的窗體效果

編輯:關於C#

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved