创建以两个表单开头的应用程序,而不是通常的表单

时间:2014-10-11 01:28:00

标签: c# winforms forms

我正在阅读 Charles Petzold用C#编程Microsoft Windows 这本书,以便了解C#.NET,以便我可以远离C++和原始WinAPI。在本书中,有一个例子,一旦程序启动就应该创建2个表单。

作者从头开始编写整个程序,但我希望使用设计器来执行此操作。重申一下,当程序启动时,必须出现2个表格。

到目前为止我唯一发现的是this thread,但我没有足够的经验来弄清楚这是否是解决我问题的方法。

仔细阅读并思考了一下,我修改了我的应用程序:

1。)我在解决方案资源管理器中右键单击了项目名称,然后选择添加新项;

2。)我添加了新表单(名为Form2);

3。)我已更改Program.cs(自动为我生成的那个),如下所示(添加了相关的片段,其余部分被省略,因此我的帖子可以尽可能简短):

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    /******** this is what I have added ***********/
    Form form2 = new Form2();
    form2.Show();
    /*********************************************/

    Application.Run(new Form1());
}

当我运行程序时,会创建2个表单。我没有注意到任何异常,如内存泄漏或类似的东西。当我第一次关闭时,第二个(form2,我添加的那个)也被关闭了。如果我关闭form2第一个表格停留。

我的问题:

  • 由于这是我第一次使用C#,您能否验证我的解决方案的正确性?如果我的方法不正确你能告诉我合适的吗?

  • 当我关闭第二个表单时,我如何修改我的程序以关闭第一个表单(我假设我需要处理第二个表单' s WM_CLOSE)?

编辑#1:

我已经处理了第二个表单的FormClosing事件,并添加了Application.Exit();来关闭第一个表单和整个应用程序。我问这是不对的,还是这个错误?

编辑#2:

我正在提交作者的原始代码,以便观众可以更好地了解我想要实现的目标:

using System;
using System.Drawing;
using System.Windows.Forms;

class PaintTwoForms
{
    static Form form1, form2;

    public static void Main()
    {
        form1 = new Form();
        form2 = new Form();

        // omitted irrelevant property settings ( background color, text... )

        form2.Show();
        Application.Run(form1);
    }
}

如果需要进一步的信息,请发表评论,我会尽快更新我的帖子。

2 个答案:

答案 0 :(得分:2)

我认为在你提到的同一个帖子中列出了更好的方法......

  1. 右键单击项目 - >添加 - >类 - >将其命名为MyApplicationContext
  2. MyApplicationContext类:

    using System.Windows.Forms;
    
    class MyApplicationContext : ApplicationContext
    {
        private void onFormClosed(object sender, EventArgs e)
        {
            Application.Exit();
        }
    
        public MyApplicationContext()
        {
            //If WinForms exposed a global event that fires whenever a new Form is created,
            //we could use that event to register for the form's `FormClosed` event.
            //Without such a global event, we have to register each Form when it is created
            var forms = new List<Form>() {
            new Form1(),
             new Form2(),
             };
            foreach (var form in forms)
            {
                form.FormClosed += onFormClosed;
                form.Show();
            }
        }
    }
    

    <子> Link

  3. 将您的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 MyApplicationContext());
        }
    }
    
  4. 现在执行,您将拥有List<Form>中的所有表单,如果您关闭它们的任何形式,列表中的所有其他表单将被关闭,如果您想要按顺序调用Form.Close()方法,您也可以使用循环,如下面的代码所示,但我认为最好Application.Exit()

    private void onFormClosed(object sender, EventArgs e)
    {
        FormCollection forms = Application.OpenForms;
        while (forms.Count > 0)
        {
            forms[0].Close();
        }
    }
    
  5. 编辑:

    是的,我上面写的代码确实比作者编写的代码更好......

    • 我的代码将创建任意数量的表单,只需将它们添加到列表中即可。
    • 我的代码是为每个表单添加相同的结束方法,所以如果任何表单关闭,其余的将关闭。
    • 我的代码将更具可读性,例如,如果你为10个或更多表单尝试相同的事情那么作者的代码将很难阅读,因为我的代码将更具可读性。

答案 1 :(得分:0)

您可以输入以下内容来显示2表格而不是1:

    private void Form1_Load(object sender, EventArgs e)
    {
            Form2 f2 = new Form2();
            f2.Show();
    }

您可以添加此代码以隐藏表单:

    this.Hide();