0

映画を保存する小さなプロジェクトを行っています。私は、イントロ フォーム、メイン フォーム、新しいムービー フォームの 3 つのウィンドウ フォームを使用しています。また、アプリケーションの心臓部である MovieManager と呼ぶクラスもあります。私の問題は、このウィンドウをどのように処理すればよいかわからないことです。

アプリケーションをイントロ フォームから開始し、ユーザーが [OK] ボタンをクリックすると、メイン フォームが表示されるとします。これを行う最善の方法は何ですか?Program.cs で、さまざまなウィンドウ フォームを表示および非表示にする MovieManager クラスのオブジェクトを作成する必要がありますか、それとも Program.cs でイントロ フォームを表示することから始めるべきですか?

4

3 に答える 3

2

アプリケーションを開始するときに、Program.csのすべてのスタッフを簡単に実行できます。IntroFormをダイアログとして表示します。ユーザーが[OK]をクリックした場合は、メインのアプリケーションフォームを開始します。それ以外の場合は、アプリケーションを閉じます。

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

    }

    Application.Run(new MainForm());
}

これらすべてのフォームに単一のインスタンスが必要な場合はMovieManager、Mainメソッドでインスタンスを作成し、同じインスタンスをとに渡すことができIntroFormますMainForm

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

于 2012-05-31T08:24:33.717 に答える
1

あなたがイントロ フォームと呼んでいるものは、スプラッシュ スクリーンと呼ぶべきです。program.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

于 2012-05-31T08:31:17.833 に答える
0

新しいフォームを表示するには、さまざまな方法があります。最初に 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();
    }
}
于 2012-05-31T08:20:31.530 に答える