【问题标题】:How to open form under the active form如何在活动表单下打开表单
【发布时间】:2012-10-03 04:13:39
【问题描述】:

在 .Net WinForms 中,我有两种形式。 Form1 已打开且处于活动状态。如何打开新表单(Form2):

  • Form1 必须有焦点
  • Form2在Form1下打开(后台Form1)

第一点很简单,见stackoverflow... 但我不知道如何在 Form1 下显示 Form2。 谢谢。

编辑

 public partial class Form1 : Form
{
    Form2 frm;

    public Form1()
    {
        InitializeComponent();
        frm = new Form2();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Focus();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.AddOwnedForm(frm);
        frm.Show();
        frm.SendToBack();
        this.BringToFront();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm.Show();
        frm.SendToBack();
        this.BringToFront();
    }

}

Form2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();            
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        textBox1.Focus();
    }

    protected override bool ShowWithoutActivation
    {
        get
        {
            return true;
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            //make sure Top Most property on form is set to false
            //otherwise this doesn't work
            int WS_EX_TOPMOST = 0x00000008;
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_TOPMOST;
            return cp;
        }
    }

【问题讨论】:

  • 你的意思是并排显示表格然后你必须设置表格的大小和位置。
  • 不,我的意思是设置Form2的Z-order。我想仍将 Form1 放在顶部,但我无法将 Form1 设置为 TOP MOST(因为 Form1 可以是应用程序中的另一个表单)。关键是:每个自动(以编程方式)打开的表单都必须在活动表单(在这种情况下为 Form1)下打开,而不是 TOP。

标签: c# .net winforms window


【解决方案1】:

我认为第二点你需要做的是:

var form2 = new Form2();
    form2.MdiParent = form1; //form1 is your parent form; use this operator in case you are creating this form from out base form

    form2.WindowState = FormWindowState.Normal;
    form2.Show();

请查看此以获取更多详细信息:

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.mdiparent.aspx

编辑

请看下面的代码,看起来frm是在Form1之上打开的。

public partial class Form1 : Form
{
    Form2 frm;

    public Form1()
    {
        InitializeComponent();
        frm = new Form2();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Maximized;
        textBox1.Focus();
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (!frm.Visible)
        {
          this.AddOwnedForm(frm);
          frm.Show();
          frm.SendToBack();
          this.BringToFront();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.AddOwnedForm(frm);
        frm.Show();
        frm.SendToBack();
        this.BringToFront();
    }

}

【讨论】:

  • 但我不想创建 MDI 表单!将打开的表格不止一个,而且来自不同的位置代码。这是我想做的简短示例。
  • 我认为为了在单个父表单下查看多个表单,您必须使用多文档界面。您可以将当前父窗体设置为具有 MdiChilds,如下所示: this.IsMdiContainer = true;然后将 form2.MdiParent 设置为此;否则,执行此操作的其他方法是使用 ShowDialog()。但是,ShowDialog 会将表单的数量限制为 2。
  • 问题是我不能使用 MDI,因为应用程序是另一家公司的模块化应用程序,我为这个应用程序制作了一个模块。所以我的应用程序不是 MDI,我不能使用它。
  • 请试试这个。 var form2 = new Form2(); this.AddOwnedForm(form2); form2.Show();让我知道这是否适合您。您可以使用 this.RemoveOwnedForm(form2); 删除表单一旦 form2 关闭。
  • 不,仍然无法正常工作。这是简单的测试代码:ulozto.cz/xUjSyrb/topmostwindow-zip
【解决方案2】:

您只需实例化 Form2 并显示它,例如:

var form2 = new Form2();
form2.Visible = true;

然后您将 Form1 设置为活动表单(假设这是在 Form1 的代码中完成的 - 因此是 this):

this.BringToFront();

【讨论】:

  • 我试过了,但它不起作用。在 Form1 中,我创建了 Form2: Form2 frm = new Form2(); frm.Visible = true; this.BringToFront();
  • 那么就用form2.SendToBack();
【解决方案3】:

我猜你想要一个对话

var form2 = new Form2(); 
form2.Visible = true; 
this.ShowDialog();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多