在C# WinForm 轻松实现滚动字幕特效的关于窗体

这是一个使用C# WinForm创建关于窗体的示例,包含滚动字幕特效,展示了如何在窗体中展示产品信息,并实现邮件和网站链接的点击事件,以及窗体的拖动功能。
在C# WinForm 轻松实现滚动字幕特效的关于窗体
原理很简单,Timer与集合、Label配合就可以轻松实现。
截图(记得在一些共享软件注册机上也看到这样的效果):
看看下面的C#源码就知道了:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Diagnostics;
  10. namespace CodingMouse.CMCSharpSDK.UI.Forms
  11. {
  12.     /// <summary>
  13.     /// 关于本软件界面
  14.     /// </summary>
  15.     public partial class frmAbout : Form
  16.     {
  17.         #region Private Members
  18.         List<Label> lblTxt = new List<Label>();
  19.         List<Label> lblScroll = new List<Label>();
  20.         int index = 0;
  21.         /// <summary>
  22.         /// 保存窗体旧坐标的X轴值和Y轴值
  23.         /// </summary>
  24.         int _x, _y;
  25.         /// <summary>
  26.         /// 保存窗体是否可移动标识
  27.         /// </summary>
  28.         bool isMove = false;
  29.         /// <summary>
  30.         /// 保存鼠标指针指向的坐标点
  31.         /// </summary>
  32.         Point _mouseLocation;
  33.         #endregion
  34.         #region Public Methods
  35.         /// <summary>
  36.         /// 无参构造
  37.         /// </summary>
  38.         public frmAbout()
  39.         {
  40.             // 构建设计器控件
  41.             InitializeComponent();
  42.             for (int i = 0; i < 13; i++)
  43.             {
  44.                 Label lbl = new Label();
  45.                 lblTxt.Add(lbl);
  46.                 lblTxt[i].Top = this.Height - 24;
  47.                 lblTxt[i].Left = 24;
  48.                 lblTxt[i].Visible = false;
  49.                 lblTxt[i].BackColor = Color.Transparent;
  50.                 lblTxt[i].ForeColor = Color.White;
  51.                 lblTxt[i].AutoSize = true;
  52.                 this.Controls.Add(lblTxt[i]);
  53.             }
  54.             lblTxt[0].Text = "产品名称: CMCSharpSDK";
  55.             lblTxt[1].Text = "产品全称: CodingMouse C# 开发工具包";
  56.             lblTxt[2].Text = "当前版本: 1.0.0.0";
  57.             lblTxt[3].Text = "";
  58.             lblTxt[4].Text = "程式设计: 邓超 (网络用名: CodingMouse)";
  59.             lblTxt[5].Text = "";
  60.             lblTxt[6].Text = "    Qicq: 454811990";
  61.             lblTxt[7].Text = "  E-mail: CodingMouse@gmail.com";
  62.             lblTxt[8].Text = "    Blog: http://blog.csdn.net/CodingMouse";
  63.             lblTxt[9].Text = "";
  64.             lblTxt[10].Text = "测试环境: Microsoft Windows Server 2003 Enterprise Edition";
  65.             lblTxt[11].Text = "          Microsoft Visual Studio 2005 Team Suite";
  66.             lblTxt[12].Text = "          Microsoft SQL Server 2005 Enterprise Edition";
  67.             // 添加事件监听
  68.             lblTxt[7].Click += new EventHandler(frmAbout_Email_Click);
  69.             lblTxt[8].Click += new EventHandler(frmAbout_WebSite_Click);
  70.             lblTxt[7].MouseMove += new MouseEventHandler(frmAbout_Link_MouseMove);
  71.             lblTxt[8].MouseMove += new MouseEventHandler(frmAbout_Link_MouseMove);
  72.             lblTxt[7].MouseLeave += new EventHandler(frmAbout_Link_MouseLeave);
  73.             lblTxt[8].MouseLeave += new EventHandler(frmAbout_Link_MouseLeave);
  74.             lblScroll.Add(lblTxt[0]);
  75.         }
  76.         #endregion
  77.         #region Event Handlers
  78.         /// <summary>
  79.         /// 链接标签鼠标移动事件
  80.         /// </summary>
  81.         /// <param name="sender"></param>
  82.         /// <param name="e"></param>
  83.         private void frmAbout_Link_MouseMove(object sender, MouseEventArgs e)
  84.         {
  85.             Label currentLabel = (sender as Label);
  86.             currentLabel.ForeColor = Color.Yellow;
  87.             currentLabel.Cursor = Cursors.Hand;
  88.         }
  89.         /// <summary>
  90.         /// 链接标签鼠标移开事件
  91.         /// </summary>
  92.         /// <param name="sender"></param>
  93.         /// <param name="e"></param>
  94.         private void frmAbout_Link_MouseLeave(object sender, EventArgs e)
  95.         {
  96.             Label currentLabel = (sender as Label);
  97.             currentLabel.ForeColor = Color.White;
  98.             currentLabel.Cursor = Cursors.Default;
  99.         }
  100.         /// <summary>
  101.         /// [E-mail]滚动标签点击事件
  102.         /// </summary>
  103.         /// <param name="sender"></param>
  104.         /// <param name="e"></param>
  105.         private void frmAbout_Email_Click(object sender, EventArgs e)
  106.         {
  107.             Process.Start("mailto:CodingMouse@gmail.com");
  108.         }
  109.         /// <summary>
  110.         /// [Blog]滚动标签点击事件
  111.         /// </summary>
  112.         /// <param name="sender"></param>
  113.         /// <param name="e"></param>
  114.         private void frmAbout_WebSite_Click(object sender, EventArgs e)
  115.         {
  116.             Process.Start("http://blog.csdn.net/CodingMouse");
  117.         }
  118.         /// <summary>
  119.         /// 计时器事件(调度信息字幕显示)
  120.         /// </summary>
  121.         /// <param name="sender"></param>
  122.         /// <param name="e"></param>
  123.         private void tmrShow_Tick(object sender, EventArgs e)
  124.         {
  125.             // 控制字幕滚动
  126.             for (int i = 0; i < lblScroll.Count; i++)
  127.             {
  128.                 lblScroll[i].Visible = true;
  129.                 lblScroll[i].Top -= 1;
  130.                 if (lblScroll[i] == lblTxt[(lblTxt.Count - 1)] 
  131.                     && lblScroll[i].Top == this.Height - 84)
  132.                 {
  133.                     index = 0;
  134.                     lblScroll.Add(lblTxt[0]);
  135.                 }
  136.                 if (lblScroll[i].Top < (lblTxt.Count - 1))
  137.                 {
  138.                     lblScroll[i].Visible = false;
  139.                     lblScroll[i].Top = this.Height - (lblTxt.Count - 1) * 2;
  140.                     lblScroll.RemoveAt(i);
  141.                 }
  142.             }
  143.             if (index < (lblTxt.Count - 1))
  144.             {
  145.                 if ((lblTxt[index].Top + lblTxt[index].Height) - lblTxt[index + 1].Top 
  146.                     == -(lblTxt.Count - 1))
  147.                 {
  148.                     lblScroll.Add(lblTxt[index + 1]);
  149.                     index++;
  150.                 }
  151.             }
  152.         }
  153.         /// <summary>
  154.         /// 窗体双击事件
  155.         /// </summary>
  156.         /// <param name="sender"></param>
  157.         /// <param name="e"></param>
  158.         private void frmAbout_DoubleClick(object sender, EventArgs e)
  159.         {
  160.             this.Close();
  161.         }
  162.         /// <summary>
  163.         /// 鼠标指针在窗体上方并按下按键事件
  164.         /// </summary>
  165.         /// <param name="sender"></param>
  166.         /// <param name="e"></param>
  167.         private void frmAbout_MouseDown(object sender, MouseEventArgs e)
  168.         {
  169.             // 仅响应鼠标左键点击事件
  170.             if (e.Button == MouseButtons.Left)
  171.             {
  172.                 // 保存旧坐标
  173.                 this._x = e.X;
  174.                 this._y = e.Y;
  175.                 // 标识窗体可移动
  176.                 this.isMove = true;
  177.             }
  178.         }
  179.         /// <summary>
  180.         /// 鼠标指针在窗体上方并移动鼠标指针事件
  181.         /// </summary>
  182.         /// <param name="sender"></param>
  183.         /// <param name="e"></param>
  184.         private void frmAbout_MouseMove(object sender, MouseEventArgs e)
  185.         {
  186.             // 如果可移动
  187.             if (this.isMove)
  188.             {
  189.                 // 根据旧坐标的相对偏移位置移动窗体
  190.                 // 方法一:
  191.                 // this.Left += e.X - this._x;
  192.                 // this.Top += e.Y - this._y;
  193.                 // 方法二:
  194.                 this.SetDesktopLocation(this.Left + e.X - this._x, this.Top + e.Y - this._y);
  195.             }
  196.             // 保存鼠标指针坐标点
  197.             _mouseLocation = e.Location;
  198.         }
  199.         /// <summary>
  200.         /// 鼠标指针在窗体上方并释放按键事件
  201.         /// </summary>
  202.         /// <param name="sender"></param>
  203.         /// <param name="e"></param>
  204.         private void frmAbout_MouseUp(object sender, MouseEventArgs e)
  205.         {
  206.             // 标识窗体不可移动
  207.             this.isMove = false;
  208.         }
  209.         /// <summary>
  210.         /// 鼠标指针在窗体上移过并保持静止状态一段时间事件
  211.         /// </summary>
  212.         /// <param name="sender"></param>
  213.         /// <param name="e"></param>
  214.         private void frmAbout_MouseHover(object sender, EventArgs e)
  215.         {
  216.             this.toolTip.ToolTipIcon = ToolTipIcon.Info;
  217.             this.toolTip.ToolTipTitle = "关闭提示";
  218.             this.toolTip.Show(
  219.                 "请双击鼠标键来关闭此窗体 ..."
  220.                 thisnew Point(_mouseLocation.X + 6, _mouseLocation.Y + 6), 
  221.                 5000);
  222.         }
  223.         #endregion
  224.     }
  225. }

                                                                                                                            2008年12月22日

                                                                                                                            By CodingMouse

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值