程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 1.窗體與界面設計-窗體動畫

1.窗體與界面設計-窗體動畫

編輯:C#入門知識

在窗體上添加一些動畫效果,可以為操作者添加一些樂趣。

031 窗體中的滾動字幕

滾動字幕的效果其實就是改變文字的位置,在窗體上顯示一串文字最好的辦法就是利用 Label 控件。將 Label 控件的位置改變就可以實現文字的位置變換,如果該控件的位置不斷的向水平方向移動,就會實現文字的滾動效果。改變 Label 控件的水平位置可以通過改變 Label 控件的 Left 屬性的值來實現。用 Timer 控件對文字的移動進行時間控件。

創建一個項目,默認窗體為 Form1,在窗體上添加 Label 控件用來顯示消息,添加 Button 控件用來控制消息的移動,添加 Timer 控件用來控制滾動速度。

namespace _031_MoveWindows
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;  //開始滾動
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false; //停止滾動
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Left -= 2;       //設置label1左邊緣與其容器的工作區左邊緣之間的距離
            if (label1.Right < 0)
            {
                label1.Left = this.Width;   //設置labal1左邊緣與其容器的工作區左邊緣之間的距離為該窗體的寬度
            }
        }
    }
}

032 動畫顯示窗體

Windows 提供了一個 API 函數 AnimateWindow,該函數可以實現窗體的動畫效果。

:在調用 Windows 的 API 函數時必須引用命名空間 System.RunTime.InteropServices。

創建一個項目,默認窗體為 Form1,在窗體上添加 PictureBox 控件,設置 PictureBox 控件的 Image 屬性。

namespace _032_FalshWindows
{
    public partial class Form1 : Form
    {
        public const Int32 AW_HOR_POSITIVE = 0x00000001;
        public const Int32 AW_HOR_NEGATIVE = 0x00000002;
        public const Int32 AW_VER_POSITIVE = 0x00000004;
        public const Int32 AW_VER_NEGATIVE = 0x00000008;
        public const Int32 AW_CENTER = 0x00000010;
        public const Int32 AW_HIDE = 0x00010000;
        public const Int32 AW_ACTIVATE = 0x00020000;
        public const Int32 AW_SLIDE = 0x00040000;
        public const Int32 AW_BLEND = 0x00080000; 

        public Form1()
        {
            InitializeComponent();                                          //初始化窗體中的空間
            AnimateWindow(this.Handle, 300, AW_SLIDE + AW_VER_NEGATIVE);    //開始窗體動畫
        }

        [DllImportAttribute("user32.dll")]
        private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            AnimateWindow(this.Handle, 300, AW_SLIDE + AW_VER_NEGATIVE + AW_HIDE);  //結束窗體動畫
        }
    }
}

033 制作閃爍的窗體

Windows 提供一個 API 函數 FlashWindow,該函數可以使窗體閃爍一下。利用該函數只能使窗體閃爍一下,如果讓窗口不停的閃爍,就需要用一個 Timer 控件每隔一段時間就調用該函數使窗體閃爍。

創建一個項目,默認窗體為 Form1,在窗體上添加 PictureBox 控件用來顯示窗體,設置 PictureBox 控件的 Image 屬性,添加 Button 控件和 Timer 控件用來開始和停止閃爍。

namespace _033_ShanShuoWindows
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;  //啟動timer1計時器
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false; //關閉timer1計時器
        }

        [System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
        public static extern bool FlashWindow(IntPtr handle, bool bInvert);

        private void timer1_Tick(object sender, EventArgs e)
        {
            FlashWindow(this.Handle, true); //啟動窗體閃爍函數
        }
    }
}

034 實現任務欄通知窗口

主要通過 Timer 組件的時間事件來實現窗體狀態的判斷,在顯示的過程中借助於 Windows 提供的 API 函數 ShowWindow 方法。

1.創建一個項目,默認窗體為 TaskMessageWindow;添加一個 Window 窗體,將其命名為 MainForm。

2.在 TaskMessageWindow 窗體上添加兩個 Button 控件,3個 Label 控件以及一個 TextBox 控件和 RichTextBox 控件,設置該窗體的 StartPosition 屬性為 CenterScreen。

3.在 MainForm 窗體中添加兩個 Label 控件、3個 Timer 控件、一個 PictureBox 控件、一個 ImageList 控件和一個 NotifyIcon 控件,修改 Timer1 組件的 Interval 屬性為 1000,Timer2 組件的 Interval 屬性為 400。

參考文章:Winform 切換或重置托盤圖標

//TaskMessageWindow 窗體代碼
namespace _034_TaskMessageWindow
{
    public partial class TaskMessageWindow : Form
    {
        public TaskMessageWindow()
        {
            InitializeComponent();
        }

        #region 聲明的變量
        public static string MainFormTitle = "";//通知窗口的標題內容
        public static string MainFormContent = "";//通知窗口的文本內容
        MainForm InformWindow = new MainForm();  //實例化類MainForm的一個對象
        #endregion

        private void informButton_Click(object sender, EventArgs e)
        {
            MainForm.IconFlickerFlag = true;      //設置圖標閃爍標識
            InformWindow.IconFlicker();          //調用閃爍圖標方法
        }

        private void closeInform_Click(object sender, EventArgs e)
        {
            InformWindow.CloseNewWindow();       //關閉新顯示的窗體
        }

        private void title_TextChanged(object sender, EventArgs e)
        {
            MainFormTitle = title.Text;          //記錄通知的標題
        }

        private void content_TextChanged(object sender, EventArgs e)
        {
            MainFormContent = content.Text;      //記錄通知的內容
        }
    }
}
//MainForm 窗體代碼
namespace _034_TaskMessageWindow
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            //開啟顯示提示窗口的計時器
            displayCounter.Start();
            //初始化工作區的大小
            System.Drawing.Rectangle rect = System.Windows.Forms.Screen.GetWorkingArea(this);//實例化一個當前窗口的對象
            this.Rect = new System.Drawing.Rectangle(rect.Right - this.Width - 1,rect.Bottom - this.Height - 1,this.Width,this.Height); //為實例化的對象創建工作區域
        }

        #region 聲明的變量
        public static int SW_SHOWNOACTIVATE = 4;//該變量決定窗體的顯示方式
        public static int CurrentState;//該變量標識當前窗口狀態
        public static bool MainFormFlag = true;
        private System.Drawing.Rectangle Rect;//定義一個存儲矩形框的區域
        private FormState InfoStyle = FormState.Hide;//定義變量為隱藏
        public static bool MouseState; //該變量標識當前鼠標狀態
        bool IconFlag = true;//用來標識圖標閃動
        public static bool IconFlickerFlag;//運用本標識避免單擊“關閉”按鈕時彈出信息框
        #endregion

        #region 聲明API函數
        [DllImportAttribute("user32.dll")]
        private static extern Boolean ShowWindow(IntPtr hwnd, Int32 cmdShow);  //該方法用來顯示窗體
        #endregion

        #region 定義標識窗體移動狀態的枚舉值
        protected enum FormState
        {
            //隱藏窗體
            Hide = 0,
            //顯示窗體
            Display = 1,
            //隱藏窗體中
            Hiding = 3,
            //顯示窗體中
            Displaying = 4,
        }
        #endregion

        #region 鼠標控制圖片的變化
        private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {
            pictureBox1.Image = imageList1.Images[1];  //設定當鼠標進入PictureBox控件時PictureBox控件的圖片
        }

        private void pictureBox1_MouseLeave(object sender, EventArgs e)
        {
            pictureBox1.Image = imageList1.Images[0];  //設定當鼠標離開PictureBox控件時PictureBox控件的圖片
        }
        #endregion

        #region 用屬性標識當前狀態
        protected FormState FormNowState
        {
            get { return this.InfoStyle; }   //返回窗體的當前狀態
            set { this.InfoStyle = value; }  //設定窗體當前狀態的值
        }
        #endregion

        #region 顯示窗體
        public void ShowNewWindow()
        {
            switch (FormNowState) //判斷當前窗體處於那種狀態
            {
                case FormState.Hide://當提示窗體的狀態為隱藏時
                    this.FormNowState = FormState.Displaying;//設置提示窗體的狀態為顯示中
                    this.SetBounds(Rect.X, Rect.Y + Rect.Height, Rect.Width, 0);//顯示提示窗體,並把它放在屏幕底端
                    ShowWindow(this.Handle, 4);      //顯示窗體
                    displayCounter.Interval = 100;   //設定時間事件的頻率為100ms一次
                    displayCounter.Start();         //啟動計時器displayCounter          
                    break;
                case FormState.Display://當提示窗體的狀態為顯示時
                    displayCounter.Stop();          //停止計時器displayCounter
                    displayCounter.Interval = 5000;  //設定時間事件的頻率為50000ms一次
                    displayCounter.Start();         //啟動計時器displayCounter
                    break;
            }
            taskBarIcon.Icon = Properties.Resources._1;//設定托盤圖標
        }
        #endregion

        #region 關閉窗體
        public void CloseNewWindow()
        {
            base.Hide();//隱藏該窗體
            iconCounter.Enabled = false;//設定計時器iconCounter不可用
            taskBarIcon.Icon = Properties.Resources._2;//設定托盤圖標
            MainForm.IconFlickerFlag = false;     //更改靜態變量IconFlickerFlag的值
        }
        #endregion

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            this.Hide();//隱藏該窗體
            iconCounter.Enabled = false;//設定計時器iconCounter不可用
            CloseNewWindow();//調用關閉窗體方法
        }

        #region 任務欄中的圖標進行閃爍
        private void iconCounter_Tick(object sender, EventArgs e)
        {
            if (IconFlag)  //當該值為真時
            {
                taskBarIcon.Icon = Properties.Resources._1;//設定托盤控件taskBarIcon的圖標
                IconFlag = false;                       //修改該值為假
            }
            else                                            //當該值為假時
            {
                taskBarIcon.Icon = Properties.Resources._2; //設定托盤控件taskBarIcon的圖標
                IconFlag = true;                             //修改該值為真
            }
        }
        #endregion

        public void IconFlicker()//自定義方法用來使托盤圖標閃爍
        {
            if (MainForm.IconFlickerFlag != false)     //當托盤閃動圖標為真時
            {
                taskBarIcon.Icon = Properties.Resources._1;//托盤圖標顯示為圖像
                iconCounter.Enabled = true;//啟動托盤圖標的Timer
                titleInform.Text = TaskMessageWindow.MainFormTitle;//在titleInform中顯示通知標題
                contentInform.Text = TaskMessageWindow.MainFormContent;//在cententInform中顯示通知內容
            }
        }
        //控制窗體的顯示
        private void taskBarIcon_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            iconCounter.Enabled = false;//停止閃爍托盤圖標計時器
            taskBarIcon.Icon = Properties.Resources._2;//清空托盤中原有的圖像
            ShowNewWindow();//調用顯示窗體方法
        }
        //從右下角顯示窗體
        private void displayCounter_Tick(object sender, EventArgs e)
        {
            switch (this.FormNowState)  //判斷當前窗體的狀態
            {
                case FormState.Display:  //當窗體處於顯示狀態時
                    this.displayCounter.Start();//啟動計時器displayCounter
                    this.displayCounter.Interval = 100;//設定計時器的時間事件間隔
                    if (!MouseState)     //當鼠標不在窗體上時
                    {
                        this.FormNowState = FormState.Hiding;//隱藏當前窗體
                    }
                    this.displayCounter.Start();            //啟動計時器displayCounter
                    break;
                case FormState.Displaying:                  //當窗體處於顯示中狀態時
                    if (this.Height <= this.Rect.Height - 12) //如果窗體沒有完全顯示
                    {
                        this.SetBounds(Rect.X, this.Top - 12, Rect.Width, this.Height + 12);//設定窗體的邊界
                    }
                    else                                     //當窗體完全顯示時
                    {
                        displayCounter.Stop();                //停止計時器displayCounter
                        this.SetBounds(Rect.X, Rect.Y, Rect.Width, Rect.Height);//設定當前窗體的邊界
                        this.FormNowState = FormState.Display;  //修改當前窗體所處的狀態值
                        this.displayCounter.Interval = 5000;    //設定計時器的時間事件間隔
                        this.displayCounter.Start();           //啟動計時器低displayCounter
                    }
                    break;
                case FormState.Hiding:                       //當窗體處於隱藏中時
                    if (MouseState)                             //當鼠標在窗體上邊時
                    {
                        this.FormNowState = FormState.Displaying; //修改窗體的狀態為顯示中
                    }
                    else                                         //當鼠標離開窗體時
                    {
                        if (this.Top <= this.Rect.Bottom - 12)        //當窗體沒有完全隱藏時
                        {
                            this.SetBounds(Rect.X, this.Top + 12, Rect.Width, this.Height - 12);//設定控件的邊界
                        }
                        else                                    //當窗體完全隱藏時
                        {
                            this.Hide();                         //隱藏當前窗體
                            this.FormNowState = FormState.Hide;     //設定當前的窗體狀態
                        }
                    }
                    break;
            }
        }

        private void MainForm_MouseEnter(object sender, EventArgs e)
        {
            MouseState = true;     //設定bool型變量MouseState的值為真
        }

        private void MainForm_MouseLeave(object sender, EventArgs e)
        {
            MouseState = false;   //設定bool型變量MouseState的值為假
        }
    }
}

035 動畫形式的程序界面

主要用到 Microsoft Animation Control 6.0(SP4)組件,因此要從工具箱“選擇項”中將該組件添加到工具箱,然後再將該組件從工具箱添加到窗體即可。

:因為使用了 AxAnimation 類,所以要添加對 WMPLib 命名空間的引用。

創建一個項目,默認窗體為 Form1,在窗體上添加 Panel 控件用來顯示圖片,添加 Microsoft Animation Control 6.0(SP4)組件用來播放動畫。

using WMPLib;

namespace _035_LeadWindows
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            axAnimation1.Open("Electron.avi");
            axAnimation2.Open("zybiao.avi");
            axAnimation3.Open("gd.avi");
        }
    }
}

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