我正在阅读 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
)?
我已经处理了第二个表单的FormClosing
事件,并添加了Application.Exit();
来关闭第一个表单和整个应用程序。我问这是不对的,还是这个错误?
我正在提交作者的原始代码,以便观众可以更好地了解我想要实现的目标:
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);
}
}
如果需要进一步的信息,请发表评论,我会尽快更新我的帖子。
答案 0 :(得分:2)
我认为在你提到的同一个帖子中列出了更好的方法......
MyApplicationContext
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 子>
将您的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());
}
}
现在执行,您将拥有List<Form>
中的所有表单,如果您关闭它们的任何形式,列表中的所有其他表单将被关闭,如果您想要按顺序调用Form.Close()
方法,您也可以使用循环,如下面的代码所示,但我认为最好Application.Exit()
。
private void onFormClosed(object sender, EventArgs e)
{
FormCollection forms = Application.OpenForms;
while (forms.Count > 0)
{
forms[0].Close();
}
}
是的,我上面写的代码确实比作者编写的代码更好......
答案 1 :(得分:0)
您可以输入以下内容来显示2表格而不是1:
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
您可以添加此代码以隐藏表单:
this.Hide();