您的位置:首页 > 编程语言 > C#

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

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

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

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: