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#中制作启动窗体的方法和问题相关推荐

  1. C# 在子窗体中调用父窗体的方法

    C# 在子窗体中调用父窗体的方法 在改软件的时候碰上一个非常麻烦的问题,查了好久才顺利解决 具体方法参考了 https://blog.csdn.net/lz00728/article/details/ ...

  2. Maya 2018 Arnold在AOV通道中制作运动向量模糊的方法

    我发现Maya2018的Arnold版本对于在AOV通道中制作的运动向量模糊方法出现了方向性的错误,我之前写的那篇运动模糊的制作方法,适用于Maya2016及其之前的版本.于是我今天花了一点时间去研究 ...

  3. 朗科U208优盘制作启动盘的方法

    最近电脑恢复镜像要用优盘启动,结果用USBOOT1.7制作HDD.ZIP等均不能启动,在百度搜索一下还有很多不能制作成功的例子.经过查找发现可以成功制作,不敢独享,把他写出来共享. 1,到http:/ ...

  4. 使用XAMPP和Hbuilder搭建PHP环境(XAMPP中Apache启动失败解决方法)

    首先安装XAMPP,安装网址:https://www.apachefriends.org/index.html# 安装Hbuilder  :http://www.dcloud.io/ 根据自己的系统选 ...

  5. android动画制作方法,在Android中制作动画的推荐方法

    我在网上搜索了更多有关在Android中为角色设置动画的信息,但并没有完全理解它.我在这里问,也许您可​​以给我一些建议或提示,以实现最佳效果. 情境 想象一下5个绘制的字符(比方说5个人头).我需要 ...

  6. window.opener用法(在子窗体中获得父窗体的方法)

    window.opener 实际上就是通过window.open打开的窗体的父窗体. 比如在父窗体parentForm里面 通过 window.open("subForm.html" ...

  7. 如何在Panel中嵌入子窗体

    文章目录 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 首先看嵌入前的效果: 点击按钮" ...

  8. 《MFC dialog中加入OpenGL窗体》

    <MFC dialog中加入OpenGL窗体> 最近学习了如何在MFC对话框程序中加入OpenGL窗体的方法,在这里将自己的实现过程归纳一下. 步骤零: 加入PictureControl控 ...

  9. 怎样在ps中制作对话气泡?一招教你轻松解决

    PS是在工作中经常使用的平面设计软件,利用ps可以实现很多操作.换天,换发色,添加亮灯等操作都是比较常见的,今天将为大家分享怎样在ps中制作对话气泡的方法,希望能给大家带来帮助. 绘制工具:PS 绘制 ...

  10. Linux 服务器(二)-linux安装方法之Centos安装介绍——Windows中制作USB启动盘 MacOS中制作USB启动盘

    Linux 服务器(二)-linux安装方法之Centos安装介绍--Windows中制作USB启动盘 & MacOS中制作USB启动盘 安装方法 Centos安装方法: 下载镜像 按需选择下 ...

最新文章

  1. Centos7上安装oracle11g/12c的安装教程推荐及注意事项
  2. 阿里、拼多多P8面试分享!
  3. Python+selenium 自动化-mac下安装配置chrome驱动方法
  4. 使用setfacl实现子目录继承父目录权 限
  5. 用原生JavaScript实现简单轮播图
  6. 线段树-HDU5737-这题有点神
  7. mysql having ct_mysql中where和having子句的区别和具体用法
  8. 2010年复旦MBA预审说明
  9. mysql创建表语句和修改表语句
  10. WireMock.NET如何帮助进行.NET Core应用程序的集成测试
  11. Java实现hsql_java – 从类创建HSQL创建表查询
  12. requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.
  13. [Python] 字典 update()函数:在字典中更新 (或加入) 键值对
  14. getX,getRawX,getWidth,getTranslationX等的区别
  15. (转载)使用Maven构建多模块项目
  16. 取得客户端的机器名,域名,登陆用户名...转
  17. Java 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
  18. 在matlab下使用深度学习预训练模型Alex Net进行迁移学习的实验与分析
  19. Terminator the Sara Conner Chronicles
  20. win7桌面不显示我的计算机名,win7系统桌面没有显示我的电脑图标的操作技巧

热门文章

  1. PLC跑马灯程序设计
  2. 新概念模拟电路简介及section5笔记
  3. MySQL 管理表记录
  4. 发布与安装Github Packages
  5. Matlab Astar算法简单对比分析
  6. Java程序员怎么优雅迈过30K+这道坎?附超全教程文档
  7. 2009年程序员考试大纲
  8. 洛达检测软件AB1562UT_1.4.4新版本下载,适用洛达全系列
  9. java 下载文件的文件名乱码_java下载文件名乱码解决方法介绍
  10. 《集成电路制造工艺与工程应用》目录