2009-07-15 13 views
1

フォームを表示する方法を混乱させます。 Windowsフォームアプリケーションを作成すると、Showメソッドを明示的に呼び出しなくても、デフォルトのForm1が自動的に表示されます。しかし、別のフォームを表示して見えるようにするには、Showを呼び出すことで可視にする必要があります。Windowsフォームの可視性の問題

なぜこのような違いがありますか?

VSTS 2008 + C#+ .Net 2.0を使用しています。

答えて

2

これは、Form1がアプリケーションのメインフォームになるためです。具体的にはApplication.Runメソッドに渡され、Form1がメインフォームとして割り当てられたApplicationContextオブジェクトが作成されます。アプリケーションが起動すると、ApplicationContextにメインフォームがあるかどうかがチェックされ、そのフォームのVisibleプロパティがtrueに設定され、フォームが表示されます。

あるいは、コードで表され、これはApplication.Runです:

public static void Run(Form mainForm) 
{ 
    ThreadContext.FromCurrent().RunMessageLoop(-1, new ApplicationContext(mainForm)); 
} 

RunMessageLoopは、メッセージループを設定するには、別の内部関数を呼び出しますし、その関数に、私たちは次のことを見つける:

if (this.applicationContext.MainForm != null) 
{ 
    this.applicationContext.MainForm.Visible = true; 
} 

これがForm1を示すものです。

これはまた、起動時にForm1フォームが自動的に表示されないようにするためのヒントを提供します。

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    // create the form, but don't show it 
    Form1 form = new Form1(); 
    // create an application context, without a main form 
    ApplicationContext context = new ApplicationContext(); 
    // run the application 
    Application.Run(context); 
} 
+0

ありがとうございますFredrik、投稿したコードブロックはどこですか? – George2

+1

私はRed Gate's Reflectorを使用しました:http://www.red-gate.com/products/reflector/ –

+0

ショーと可視の違いを真とはどのような違いがありますか? – George2

4

VSが生成する "Program.cs"ファイルを見てください。

static class Program { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); // and especially this line :) 
    } 
} 
+0

こんにちはStormenetが、私はショーはあなたが引用されたコードから呼び出された見つけることができませんでした。私たちがやらなければならないことは、Form1がApplicationContextにメインフォームとして割り当てられなくても、アプリケーションを起動する方法を見つけることです。それ以上のヒント? – George2

+0

Application.RunがShowを呼び出します。 基本的に、その行はアプリケーションの初期フォームがForm1であることを示しています。別のスタートアップフォームを表示する場合は、その行を変更してください。 – Stormenet

1

これは、form1がApplication.Run(new form1())によって呼び出されるメインフォームであるためです。

このコードはprogram.csファイルにあり、どのような形式にでも変更できます。

+0

Ahmed、私が別の新しいFormを作成し、それをForm2 form2 = new Form2()を使って構築すると、form2は決して表示されません。私は、コードがPrograms.csの私のためにVSTSが生成するものと同じだと思うし、Form2がなぜ表示されないのか分からないのですが? – George2

関連する問題