1.窗体与界面设计-窗体动画
2013-06-17 14:26 BytesLoop 阅读(1169) 评论(1) 编辑 收藏 举报在窗体上添加一些动画效果,可以为操作者添加一些乐趣。
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"); } } }
作者:skyXnet
邮箱:iwanc@qq.com
出处:http://www.iwanc.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。