C#程序启动欢迎窗体实现(转)

当程序在启动过程中需要花一些时间去加载资源时,我们希望程序能显示一个欢迎界面,能简单介绍软件功能的同时还能告知用户该程序还在加载中,

使得用户体验更友好。
实现如下:

1. 添加欢迎界面的窗体(比如Frm_Welcom),做以下调整:
将FormBorderStyle属性设成None,即没有窗体边框                                                                                 将ShowInTaskbar属性设成False,这样窗体不显示在任务栏中
将StartPosition属性设成CenterScreen,即总是居中
将TopMost属性设成True,即总是在顶部
将UseWaitCursor属性设成Ture,即显示等待光标,让人感觉后台还在运行
增加一个PictureBox控件,与欢迎图片大小一致,窗体的大小也设成一致
增加一个ProgressBar控件,将Style设成Marquee,将MarqueeAnimationSpeed设成50
增加一个Label控件,将BackColor属性设成透明(Transparent),然后给定其text一个初始值,同时在窗体的Load函数中添加以下代码
private void Frm_Welcom_Load(object sender, EventArgs e)
{
pictureBox1.Controls.Add(labelX1);//把label1整到picturebox控件里,通俗的讲就是让后者把前者给包起来,加上它才能显示图片
//label1.Location = new Point(5, 10); //这个很重要,就是改变一下label的位置,后面的参数你自己随便定
        //如果不加这一条的话背景透明了但字体也会不见(事实证明不加也可以)

}


2. 主界面的构造函数改成以下代码:
//先在整个类中定义两个全局变量
public Thread showSplashThread;
public Frm_Welcom sForm;
//构造函数代码
public Frm_Main()
{
   //启动一个线程
showSplashThread = new Thread(new ThreadStart(ShowSplash));
showSplashThread.Start();

//下边为原有代码
InitializeComponent();
..........
}
3. 显示SplashForm的线程函数
private void ShowSplash()
{
try
{
   sForm = new Frm_Welcom();
   sForm.ShowDialog();
                //等待两秒,使主线程充分显示
                Thread.Sleep(2000);
}
catch (ThreadAbortException e)
{
                throw e;
}
finally
{
                sForm = null;
}
}
4. 在主窗体的Load事件加激活自己的代码

       [DllImport("User32.dll")]
        public static extern void SetForegroundWindow(IntPtr hwnd);
        private delegate void txtHandeler(object obj,string str);

//定义需要代理的函数
        private void evaluateTxt(object obj,string str)
        {
            sForm.labelX1.Text = str;
        }

        private void Frm_Main_Load(object sender, EventArgs e)
        {
            //显示欢迎界面的进度条
            SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle);

            txtHandeler txthandler = new txtHandeler(evaluateTxt);
            string str = "正在分配权限,请稍候...";
            object obj = null;
            sForm.labelX1.Invoke(txthandler, new object[] { obj,str }); //sForm.labelX1为欢迎界面中用来显示操作的label控件
  
      //以下方法错误,如果不用以上代理的方法不能给textBox赋值,因为不是从创建它的线程访问它
            //sForm.labelX1.Text = "正在分配权限,请稍候...";
    

     //原有代码区域开始
            //功能相关全部不可见
            basictool.FormFunClear(this);
            if (GlobalParams.StrGUserId == "hjadmin")
            {
                //得到所有权限
                basictool.FormFunall(this);
                //进行主菜单设置
                //对主菜单是否可见进行设置
                this.office2007StartButton1.Visible = true;

                set_mainmenu();
            }
            else
            {
                //进行权限初始化
                basictool.FormFunInit(this);
                //进行主菜单设置
                //对主菜单是否可见进行设置
                this.office2007StartButton1.Visible = false;
                DataSet dsFun = new DataSet();
                dsFun = BusinessDb.GetAllFunByUserId(GlobalParams.StrGUserId.Trim(), this);
                foreach (DataRow deFunTemp in dsFun.Tables[0].Rows)
                {
                    string strtype = deFunTemp[1].ToString();
                    if (deFunTemp[1].ToString() == "1")
                    {
                        string funname = deFunTemp[0].ToString();
                        //如果有此功能设置可见
                        if (deFunTemp[0].ToString().Equals("office2007StartButton1"))
                        {
                            this.office2007StartButton1.Visible = true;

                        }
                    }

                }
                set_mainmenu();
            }
            //右键菜单权限进行设置

            basictool.SetRightButtonFun(contextMenuStrip1FrmMain, this);
            basictool.SetRightButtonFun(contextMenuStrip2FrmMain, this);
            basictool.SetRightButtonFun(contextMenuStrip3FrmMain, this);
            basictool.SetRightButtonFun(contextMenuStrip4_Theme, this);

     //同样需要用代理的方法赋值
            str = "正在加载地图,请稍候...";
            sForm.labelX1.Invoke(txthandler, new object[] { obj, str });
            //sForm.labelX1.Text = "正在加载地图,请稍候...";

            //解析出工程目录
            path = BasicTool.getRelativePath();
           
            getSpaceMaps();
            //宗地查询窗口初始化
            this.Btn_TestPanel_Click(null, null);
            itemPanel1.BackgroundStyle.BackColor = Color.FromArgb(191,219,255);
            itemPanel2.BackgroundStyle.BackColor = Color.FromArgb(191, 219, 255);

            leftlayout();
     //原有代码区域结束

            //中止欢迎界面的线程
            showSplashThread.Abort();
            showSplashThread.Join(); // Wait until the thread aborted
            showSplashThread = null;
        }

参考链接:http://www.lordong.cn/blog/post/18.html

使PictureBox控件透明的方法还可以用:

设置PictureBox控件上的Label控件透明的步骤:

1) 新建一个PictureBox控件,名称是pbxImage
2) 新建一些Label控件,放在PictureBox上
3) 添加PictureBox的Paint事件
4) 添加如下代码:

//pbxImage is PictureBox control
    private void pbxImage_Paint(object sender, PaintEventArgs e)
    {
      foreach (Control C in this.Controls)
      {
        if (C is Label)
        {
          Label L = (Label)C;
          L.Visible = false;
          e.Graphics.DrawString(L.Text, L.Font, new
SolidBrush(L.ForeColor), L.Left - picBack.Left, L.Top - picBack.Top);
        }
      }
    }

转载于:https://www.cnblogs.com/shaolai/archive/2013/01/04/2844495.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值