C#中制作启动窗体的方法和问题
C#中制作启动窗体的方法和问题
2009-10-17 00:33:17| 分类: 程序|举报|字号 订阅
下载LOFTER我的照片书 |
在开发windows桌面程序时,经常碰到的一个问题就是:在主窗体显示之前,需要加载大量数据,这样,当用户启动程序后,需要等待一段时间才可以看到主窗体。好的程序设计人员会为软件加上一个启动窗体,并在后台执行加载数据的代码,典型的应用如VS系列、PhotoShop等软件。用户一旦运行程序,首先看到的是启动窗体以及窗体上显示的相关信息,以避免用户产生启动程序后没有反应的误解。
比如我的主窗体名称是MainForm,启动窗体名称是SplachForm,在显示MainForm之前需要加载大量数据,那么可以先显示SplachForm,并在上面以文字或进度条的形式显示数据加载的情况,用户知道应用程序在做什么,也就可以耐心等待了。
简单的做法是修改Application.Run()方法的参数,把主窗体改为SplachForm,当数据加载完成时,隐藏SplachForm,显示MainForm。这里不可以关闭SplachForm,因为C#中,关闭Application.Run方法中调用的窗体对象,将会退出整个应用程序。
上面这个做法的缺点是不可以在MainForm中使用Close方法来退出程序,因为SplachForm只是隐藏,程序是无法退出的,必须使用Application.Exit()方法来退出整个应用程序。
稍好一点的做法是,Application.Run方法的参数仍然是MainForm对象,在MainForm窗体的构造函数中添加以下代码:
SplachForm form=new SplachForm();
form.ShowDialog();
在SplachForm的Load事件中添加代码:
this.Show();
this.Refresh();
Init(); //加载数据的方法
this.Close();
这样主窗体仍然是MainForm,并且在加载完数据后自动显示MainForm。
这个做法虽然简单,但实际效果并不差。不过只适用于启动窗体消失后必然显示MainForm窗体的情况,如果在启动窗体消失后,因为某种原因需要退出程序,效果就不行了,无论怎么处理,主窗体仍然会被显示,即使把上面的this.Close()改成Application.Exit(),主窗体也会显示一下才退出程序。这是因为Application.Run方法的特性造成的,它使调用的窗体可见,并在退出程序时返回到调用的地方。
更好的做法是使用线程技术,把启动窗体和主窗体分为不同线程,先创建启动窗体的线程,在完成加载数据的方法后,创建主窗体的线程,同时关闭启动窗体线程。例如启动窗体加载数据之后,需要显示登录窗体,并根据用户的登录情况来决定是否显示主窗体,用这种方式实现就非常好。当用户登录失败或放弃登录时,不创建主窗体线程,退出程序,不会出现第二种方法的情况。需要注意的是,在VS2005以上的版本中,有一个线程调用安全的问题。
三种方式都用过,第一种简单,效果不太好。第二种也简单,在只有启动窗体并在启动窗体完成后直接进入主程序的情况下,效果也不错。第三种稍为麻烦,但可以处理的情况更多,如在主窗体显示之前要显示多个窗体,目前我只能用第三种方法来实现。第三种方法的代码较多,懒得打字贴代码了,记上一笔,以免日后又忘了……
C#中制作启动窗体的方法和问题相关推荐
- C# 在子窗体中调用父窗体的方法
C# 在子窗体中调用父窗体的方法 在改软件的时候碰上一个非常麻烦的问题,查了好久才顺利解决 具体方法参考了 https://blog.csdn.net/lz00728/article/details/ ...
- Maya 2018 Arnold在AOV通道中制作运动向量模糊的方法
我发现Maya2018的Arnold版本对于在AOV通道中制作的运动向量模糊方法出现了方向性的错误,我之前写的那篇运动模糊的制作方法,适用于Maya2016及其之前的版本.于是我今天花了一点时间去研究 ...
- 朗科U208优盘制作启动盘的方法
最近电脑恢复镜像要用优盘启动,结果用USBOOT1.7制作HDD.ZIP等均不能启动,在百度搜索一下还有很多不能制作成功的例子.经过查找发现可以成功制作,不敢独享,把他写出来共享. 1,到http:/ ...
- 使用XAMPP和Hbuilder搭建PHP环境(XAMPP中Apache启动失败解决方法)
首先安装XAMPP,安装网址:https://www.apachefriends.org/index.html# 安装Hbuilder :http://www.dcloud.io/ 根据自己的系统选 ...
- android动画制作方法,在Android中制作动画的推荐方法
我在网上搜索了更多有关在Android中为角色设置动画的信息,但并没有完全理解它.我在这里问,也许您可以给我一些建议或提示,以实现最佳效果. 情境 想象一下5个绘制的字符(比方说5个人头).我需要 ...
- window.opener用法(在子窗体中获得父窗体的方法)
window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html" ...
- 如何在Panel中嵌入子窗体
文章目录 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 首先看嵌入前的效果: 点击按钮" ...
- 《MFC dialog中加入OpenGL窗体》
<MFC dialog中加入OpenGL窗体> 最近学习了如何在MFC对话框程序中加入OpenGL窗体的方法,在这里将自己的实现过程归纳一下. 步骤零: 加入PictureControl控 ...
- 怎样在ps中制作对话气泡?一招教你轻松解决
PS是在工作中经常使用的平面设计软件,利用ps可以实现很多操作.换天,换发色,添加亮灯等操作都是比较常见的,今天将为大家分享怎样在ps中制作对话气泡的方法,希望能给大家带来帮助. 绘制工具:PS 绘制 ...
- Linux 服务器(二)-linux安装方法之Centos安装介绍——Windows中制作USB启动盘 MacOS中制作USB启动盘
Linux 服务器(二)-linux安装方法之Centos安装介绍--Windows中制作USB启动盘 & MacOS中制作USB启动盘 安装方法 Centos安装方法: 下载镜像 按需选择下 ...
最新文章
- Centos7上安装oracle11g/12c的安装教程推荐及注意事项
- 阿里、拼多多P8面试分享!
- Python+selenium 自动化-mac下安装配置chrome驱动方法
- 使用setfacl实现子目录继承父目录权 限
- 用原生JavaScript实现简单轮播图
- 线段树-HDU5737-这题有点神
- mysql having ct_mysql中where和having子句的区别和具体用法
- 2010年复旦MBA预审说明
- mysql创建表语句和修改表语句
- WireMock.NET如何帮助进行.NET Core应用程序的集成测试
- Java实现hsql_java – 从类创建HSQL创建表查询
- requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.
- [Python] 字典 update()函数:在字典中更新 (或加入) 键值对
- getX,getRawX,getWidth,getTranslationX等的区别
- (转载)使用Maven构建多模块项目
- 取得客户端的机器名,域名,登陆用户名...转
- Java 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 在matlab下使用深度学习预训练模型Alex Net进行迁移学习的实验与分析
- Terminator the Sara Conner Chronicles
- win7桌面不显示我的计算机名,win7系统桌面没有显示我的电脑图标的操作技巧