如何处理多个窗口表单

本文关键字:窗口 表单 处理 何处理 | 更新日期: 2023-09-27 18:35:56

我正在做一个小项目来存储电影。我正在使用三个窗口窗体,一个介绍窗体,一个主窗体和一个新的电影窗体。我还有一个类,我称之为MovieManager,它是应用程序的核心。我的问题是我不确定我应该如何处理这个窗口。

假设我希望应用程序从介绍表单开始,当用户单击"确定"按钮时,应该会出现主表单。最好的方法是什么?我应该在程序中.cs创建一个显示和隐藏不同窗口窗体的 MovieManager 类的对象,还是应该在程序中.cs只是从显示介绍窗体开始?

如何处理多个窗口表单

启动应用程序时,您只需在程序中.cs做所有员工即可。将您的介绍表单显示为对话框。如果用户单击"确定",则启动主应用程序表单,否则关闭应用程序。

static void Main()
{
    IntroForm introForm = new IntroForm();
    if (introForm.ShowDialog() != DialogResult.OK)
    {
        Application.Exit();
        return;
    }
    Application.Run(new MainForm());
}

如果你需要所有这些表单的单个MovieManager实例,那么你可以在 Main 方法中创建它并将相同的实例传递给 IntroFormMainForm

MovieManager movieManager = new MovieManager();
IntroForm introForm = new IntroForm(movieManager);
if (introForm.ShowDialog() != DialogResult.OK)
{
    Application.Exit();
    return;
}
Application.Run(new MainForm(movieManager));

您也可以将MovieManager实现为单例,可以通过静态属性MovieManager.Instance在任何地方访问。

你所说的介绍形式,我应该称之为启动画面。在程序中.cs我应该只是弹出启动画面(带有徽标、标题和有关应用程序、版本号等的信息)。初始屏幕会显示一定的时间(为此使用计时器,或者 Thread.Sleep 可能会有点重)。

当初始屏幕关闭显示 MainForm 时,您可以从那里实例化 MovieManager 或使用静态 MovieManager(这取决于它的使用)。然后,您可以从主窗体中实例化并显示新的电影窗体。

我们使用一段代码,如下所示:

static void Main(string[] args)
{
  try
  {
    SplashScreen.ShowSplashScreen();
    Application.DoEvents();
    SplashScreen.WaitForVisibility(.5);
    bool starting = true;
    while (starting)
    {
      try
      {
        SplashScreen.SetStatus("Initialize mainform...");
        starting = false;
        Application.Run(new MainForm());
      }
      catch (Exception ex)
      {
        if (starting)
          starting = XtraMessageBox.Show(ex.Message, "Fout bij initialiseren", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1) == DialogResult.Retry;
        else
          throw (ex);
      }
    }
  }
  catch (Exception ex)
  {
    if (ex is object)
      XtraMessageBox.Show(ex.Message, "Algemene fout", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
  }
}

初始屏幕(摘录)中的代码如下所示:

if (_splashForm == null)
{
  ThreadPool.QueueUserWorkItem(RunSplashForm, null);
  while (_splashForm == null || _splashForm.IsHandleCreated == false)
  {
    System.Threading.Thread.Sleep(50);
  }
}

也许这些链接也会为您提供一些有用的信息:

http://www.reflectionit.nl/Articles/Splash.aspx

我们

以此作为我们自己代码的基础:

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

有不同的方法可以显示新表单。 您可以先使用 MdiWinForm,您必须将 IsMdiContainer 属性更改为 true,然后在 MainForm 中使用这些代码:

  Form2 f2;    
private void button1_Click(object sender, EventArgs e)
{
    if (f2 == null) {
       f2 = new Form2();
       f2.MdiParent = this;
       f2.FormClosed += delegate { f2 = null; };
       f2.Show();
    }
    else {
       f2.Activate();
    }
}