【问题标题】:Splash screen never fully loading before being closed启动画面在关闭前从未完全加载
【发布时间】:2012-05-04 19:32:51
【问题描述】:

我目前正在向我的 winform 添加启动画面。我的启动画面只是另一种形式,在哪里,

this.Text = "";
this.ControlBox = False;

表单中的所有内容都是带有 BackgroundImage 和

的 PictureBox
this.BackgroundImageLayout = BackgroundImageLayout.Center 

还有一个 ProgressBar,它会增加值直到我的 MainForm 的初始化完成。

我使用 Show 而不是 ShowDialog 打开 Splash。好吧,ProgressBar 可以正常工作,但 PictureBox 中的 BackgroundImage 似乎永远不会加载。我所看到的只是一个带有 ProgressBar 的白色背景。

我在递增 ProgressBar 的同一方法中使用 SplashScreen.Show(),并且在从 MainForm 的构造函数调用的方法中调用此方法。

我曾尝试在单独的线程中使用 SplashScreen.Show,但这导致了同样的问题。任何帮助将不胜感激,如果需要,我愿意提供更多信息。

已解决:

在自己的线程中启动时必须使用 ShowDialog,因为 Show 将在线程结束时关闭窗体,但使用 ShowDialog,线程将一直运行直到窗体关闭。感谢大家的帮助。

【问题讨论】:

    标签: c# winforms splash-screen


    【解决方案1】:

    我的猜测是您正在阻止消息队列,但没有看到更多代码我无法确定。

    您可能想看看这个闪屏项目。我以前用过。效果很好。

    http://www.codeproject.com/Articles/5454/A-Pretty-Good-Splash-Screen-in-C

    除其他外,该项目在单独的线程上运行启动屏幕以保持响应并防止消息队列阻塞。

    【讨论】:

    • 这听起来像。如果加载发生在前台,您将需要生成一个新线程,该线程要么在后台进行加载,要么处理消息队列。
    • 我实际上已经尝试在单独的线程中使用 Show() ,但它仍然没有工作。什么时候绘制背景图像?在 InitializeComponent() 中?
    • 自从我做 WinForms 以来已经有一段时间了,但图像可能是为了响应控件捕获的 Windows 消息而绘制的,该消息说它需要重绘自身。如果您阻止消息队列,控件将不会收到该消息。
    【解决方案2】:

    问题是您的初始屏幕显示在主线程上,然后主线程立即继续执行初始化应用程序的其他工作,并且永远没有机会绘制初始屏幕。

    您需要在自己的线程上运行启动画面,以使其能够清晰地绘制。见http://msdn.microsoft.com/en-us/library/aa446493.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多