求助,如何让程序启动时,主窗体延迟几秒再显示

Kenall 2011-10-10 03:02:48
因为主界面载入时候,其中几张表格会有一个读数据库初始化的过程,想将数据读出来初始化后一起显示出来。
所以考虑让主窗体生成后延迟2秒显示出来。利用了定时器来实现。

不过尝试了几个方法之后,效果都不是很理想。
主要尝试的方法有
1、在Form_Load之中加入form1.Hide(); //感觉加进去这个函数根本没起作用。
2、构造form1函数之中加入form1.hide();//效果跟方法1一样。
3、利用事件Shown//发现主窗体在生成之后,会出现一次,然后再消失,效果还是不好
4、用visiable = false尝试了下1、2方法,感觉跟用hide没什么两样。


快郁闷死了,求教各位给个思路
...全文
547 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
idaydayup 2011-10-10
  • 打赏
  • 举报
回复
百度搜索溅射屏幕
cherho0 2011-10-10
  • 打赏
  • 举报
回复
完毕,我说的太多了。。。
cherho0 2011-10-10
  • 打赏
  • 举报
回复
我刚才说的例子是一种方式,还有一种
static class Program
{
private static frmMain _mainForm = null;
private static frmStartup _startForm = null;

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

_startForm = new frmStartup();
_startForm.Show();

_mainForm = new frmMain();
_mainForm.Loaded += new EventHandler(_mainForm_Loaded);

Application.Run(_mainForm);
}

static void _mainForm_Loaded(object sender, EventArgs e)
{
_startForm.Close();
_startForm = null;
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
if (_startForm != null)
_startForm.Close();
_mainForm.Hook.ShowProcess("Ready", false);
AppLog.LogError(e.Exception.ToString());
MessageBox.Show(e.Exception.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Kenall 2011-10-10
  • 打赏
  • 举报
回复
基本思路有了,感谢各位
cherho0 2011-10-10
  • 打赏
  • 举报
回复
举个例子

public class SceneMgr
{
public static event EventHandler LoadComplete;
private SceneMgr()
{
LoadSceneFiles();
}
/// <summary>
/// 获取场景管理器单例
/// </summary>
/// <returns></returns>
public static SceneMgr GetSceneMgr()
{
if (_sm == null)
{
Mutex mu = new Mutex();
mu.WaitOne();

if (_sm == null)
{
_sm = new SceneMgr();
}
if (LoadComplete != null)
{
LoadComplete(null, null);
}
mu.Close();
}

return _sm;
}

}

public partial class LoadForm : Form
{
private void LoadSource()
{

SceneMgr.LoadComplete += new EventHandler(SceneMgr_LoadOk);
lblStatus.Text = "开始加载技能资源";
Application.DoEvents();
SceneMgr.GetSceneMgr();
}
}
void SceneMgr_LoadOk(object sender, EventArgs e)
{
lblStatus.Text = "资源加载已完成";
lblStatus.ForeColor = Color.Green;
Application.DoEvents();
Thread.Sleep(100);
this.Hide();
frm.Show();
}

cherho0 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kenall 的回复:]

我需要显示的主窗体,因为进行数据库交互操作,界面上表格数据显示感觉会有一秒左右的延时,我的目的是想等这些数据初始化完成后,将整个界面一起显示,所以想让窗体初始化时候不显示,等延迟个几秒再显示出来。
所以欢迎界面是用来拖延这段初始化时间的。单纯打开关闭的话对于我最初的目的相左了
请不要再讨论窗体关闭打开的问题了 >_<"
[/Quote]

你就在这时数据加载的方法中定义个事件,然后再加载窗体里面注册这个事件,数据加载完了,触发注册的事件,然后关闭加载窗体,显示主窗体,懂?异步加载,而且不会卡死
  • 打赏
  • 举报
回复
嘿,刚打开电脑有点卡。

不应该在这个窗体生成之前就完成 --> 原本应该在这个窗体生成之前就完成
Kenall 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hsuifengershi 的回复:]
在打开前 执行这句
程序暂停1秒
System.Threading.Thread.Sleep(1000);
[/Quote]
System.Threading.Thread.Sleep也是阻塞进程的等待,如果你用在界面初始化的话,你会发现,你的整个界面就像是死机一样的效果。

讨论那么多,我现在明白了,我就是想知道有没有让一个窗体,一出生就把自己不留痕迹的隐藏掉的方法

就像葫芦娃七兄弟中六娃的本领 “Orz
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kenall 的回复:]
我需要显示的主窗体,因为进行数据库交互操作,界面上表格数据显示感觉会有一秒左右的延时,我的目的是想等这些数据初始化完成后,将整个界面一起显示,所以想让窗体初始化时候不显示,等延迟个几秒再显示出来。
所以欢迎界面是用来拖延这段初始化时间的。单纯打开关闭的话对于我最初的目的相左了
请不要再讨论窗体关闭打开的问题了 >_<"
[/Quote]

晕。那么你的初始化数据就根本不应该在这个窗体生成之前就完成啊。
cherho0 2011-10-10
  • 打赏
  • 举报
回复
public partial class LoadForm : Form
{
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x01;
private const int HTCAPTION = 0x02;
private FrmTestTool frm;
public LoadForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT)
{
m.Result = (IntPtr)HTCAPTION;
}
return;
}
base.WndProc(ref m);
}
private void LoadSource()
{
var dt = new DirectoryInfo("../Scene");
var max = dt.GetFiles().Where(f => !f.Name.Contains("S")).Count();
progressBar1.Maximum = max;
SceneMgr.LoadScene += new EventHandler<jy.DataEventArgs<string>>(SceneMgr_LoadScene);
SceneMgr.Increment += new EventHandler(SceneMgr_Increment);
SceneMgr.LoadComplete += new EventHandler(SceneMgr_LoadOk);
lblStatus.Text = "开始加载技能资源";
Application.DoEvents();
SkillMgr.GetSkillMgr();
SceneMgr.GetSceneMgr();
}

void SceneMgr_LoadOk(object sender, EventArgs e)
{
lblStatus.Text = "资源加载已完成";
lblStatus.ForeColor = Color.Green;
Application.DoEvents();
Thread.Sleep(100);
this.Hide();
frm.Show();
}

void SceneMgr_Increment(object sender, EventArgs e)
{
progressBar1.Increment(1);
}

void SceneMgr_LoadScene(object sender, jy.DataEventArgs<string> e)
{
lblStatus.Text = "正在加载资源" + e.Arg1; Application.DoEvents();
}

private void LoadForm_Shown(object sender, EventArgs e)
{
frm = new FrmTestTool();
LoadSource();

}

private void label1_Click(object sender, EventArgs e)
{
Application.Exit();
}
  • 打赏
  • 举报
回复
主窗体(或者欢迎界面窗体)可以new出来主窗体 --> 主窗体(或者欢迎界面窗体)可以new出来这个交互窗体
Kenall 2011-10-10
  • 打赏
  • 举报
回复
我需要显示的主窗体,因为进行数据库交互操作,界面上表格数据显示感觉会有一秒左右的延时,我的目的是想等这些数据初始化完成后,将整个界面一起显示,所以想让窗体初始化时候不显示,等延迟个几秒再显示出来。
所以欢迎界面是用来拖延这段初始化时间的。单纯打开关闭的话对于我最初的目的相左了
请不要再讨论窗体关闭打开的问题了 >_<"
  • 打赏
  • 举报
回复
目的明确 前来接分 呵呵
  • 打赏
  • 举报
回复
在打开前 执行这句
程序暂停1秒
System.Threading.Thread.Sleep(1000);
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kenall 的回复:]
好吧,怪我没说清楚,我就是一个欢迎界面来显示,然后主窗体在那边初始化。

现在的问题是主窗体在初始化的时候就显示了出来,2个窗体一起显示。

所以我需要将主窗体延迟到欢迎界面3秒结束自动关闭后再显示出来
[/Quote]

既然不是第一个显示的窗体,这个窗体就根本不应该设计为主窗体。只要你另外搞一个主窗体,一切都迎刃而解。主窗体(或者欢迎界面窗体)可以new出来主窗体,并且注册其 Closed 事件,等它关闭了就自动关闭自己。
Kenall 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhoucong1020 的回复:]
引用 10 楼 zhoucong1020 的回复:
引用 9 楼 kenall 的回复:
好吧,怪我没说清楚,我就是一个欢迎界面来显示,然后主窗体在那边初始化。

现在的问题是主窗体在初始化的时候就显示了出来,2个窗体一起显示。

所以我需要将主窗体延迟到欢迎界面3秒结束自动关闭后再显示出来

Application.Run(new Form1());这里改成你的欢迎窗体,在欢迎窗……
[/Quote]
Application.Run(new Form1());这个函数是要等窗体Form1关闭了,才会执行下一个
这样子对于我来讲,跟在Form_Load里面加载Form2.ShowDialog()效果是一样,都是阻塞主窗体的运行。
问题时显示欢迎窗体时,我需要主窗体同时进行初始化操作……
stonespace 2011-10-10
  • 打赏
  • 举报
回复
两次Run我还没试过,看起来很新奇不知道行不行,呵呵,
zhoucong1020 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 stonespace 的回复:]
引用 10 楼 zhoucong1020 的回复:

Application.Run(new Form1());这里改成你的欢迎窗体,在欢迎窗体中启动你的主窗体


这个方法不好,如果关闭欢迎界面整个程序会退出,

最好在Application.Run之前用ShowDialog显示欢迎界面,欢迎界面设置定时器关闭自己,
[/Quote]
嗯,我已经意识到了,我已经改成11楼那种方法您看可行吗
stonespace 2011-10-10
  • 打赏
  • 举报
回复

[Quote=引用 10 楼 zhoucong1020 的回复:]

Application.Run(new Form1());这里改成你的欢迎窗体,在欢迎窗体中启动你的主窗体
[/Quote]

这个方法不好,如果关闭欢迎界面整个程序会退出,

最好在Application.Run之前用ShowDialog显示欢迎界面,欢迎界面设置定时器关闭自己,
zhoucong1020 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhoucong1020 的回复:]
引用 9 楼 kenall 的回复:
好吧,怪我没说清楚,我就是一个欢迎界面来显示,然后主窗体在那边初始化。

现在的问题是主窗体在初始化的时候就显示了出来,2个窗体一起显示。

所以我需要将主窗体延迟到欢迎界面3秒结束自动关闭后再显示出来

Application.Run(new Form1());这里改成你的欢迎窗体,在欢迎窗体中启动你的主窗体
[/Quote]
这样做也不好,再改一下
Application.Run(new 欢迎窗体());
Application.Run(new 主窗体());
这样欢迎窗体关闭后会自动启动主窗体
加载更多回复(10)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧