在容器窗体控件过来子窗体?在容器窗体控件过来子窗体?(Controls in container f

2019-05-12 06:42发布

在容器中,形式我有菜单和按钮打开疗法形式。

在这里,我面临的一个问题,当我打开任何形式的这些buttns和标贴过来新开的形式。

请指导我如何管理这个问题? 我想开一个新的形式,并保持这些容器窗体的控件中的回地面。

Answer 1:

我也得到了同样的问题。 我得到了一个替代解决方案如下所述:

  1. 插入一个定时器控制
  2. 我已经添加了控制面板中的容器
  3. 并做了以下

     private void timer1_Tick(object sender, EventArgs e) { if ((int)MdiChildren.GetLength(0) > 0) { panel1.Visible = false; } else { panel1.Visible = true; } } 


Answer 2:

我想我看到你做了什么。 您正在使用MDI,你把菜单标签和按钮的MDI父窗体上。 你做了一件与MDI客户端窗口,它通常是暗灰色。 也许你想出如何改变其背景色或更改Windows系统颜色。 是的,你的屏幕截图它的结果。 问题是,MDI客户端形式的父级MDI客户端窗口。 这使得它们显示你把父窗体上的控件后面

有没有办法解决这个,你将不得不改变你的UI。 为了保持MDI,把面板父窗体上和它的Dock属性设置为Left。 在移动的菜单控件。 MDI客户端窗口将缩小,占据父窗体的其余部分。 和子窗体将限制自己该区域。 凌晨痛苦的一点是,你必须重新组织菜单,以适应在面板中的更小的空间。



Answer 3:

如果它是一个MDI的应用程序,你把控件的父窗口,然后他们会在任何创建的子窗口的顶部显示。 你需要有你的菜单中的一个子窗口也没有父窗体上。

看看这个文章和这个 。

expecially这样的:

父窗体可能不包含任何控件。 >

编辑:添加附加信息



Answer 4:

@Hans帕桑特有正确的答案,但你也可以不使用MDI形式在所有解决您的问题。 一些选项:

  • 使用单独的形式:有一个菜单形式,通常大/最大化,并通过它们的推出设置在它前面的子窗体的Parent属性菜单形式,或
  • 使用一个单一的形式,但与对接库(我用DockPanel中套房过去)。 这基本上是一个重新实现的MDI形式,具有额外的功能。 这是一些工作得到运行,但它可以让你建立一些不错的用户界面。

这两个需要你的UI代码显著的变化,虽然。



Answer 5:

这里主要的窍门是治疗小儿形式控制。 您将创建一个子窗体就像任何其他的控制。 当您使用此方法,你必须设置它的顶级假 - 否则将无法正常工作。

下面的代码行用于创建一个子窗体:

Form childForm = new Form(); //initialize a child form

childForm.TopLevel = false; //set it's TopLevel to false

Controls.Add(childForm); //and add it to the parent Form
childForm.Show(); //finally display it

childForm.BringToFront(); //use this it there are Controls over your form.

更多的细节在这里



Answer 6:

看来好像这种形式是与其他子控件的兄弟姐妹。 你必须打开它作为窗口的子? 不能把它像一个非模态对话框,不是主窗体的子窗口?

如果它必须是主要形式和这些控件的兄弟姐妹中,那么你将不得不设置它的Z顺序。 有没有财产为,所以你将不得不把目光投向Win32 API调用, SetWindowPos

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
int hWnd, // window handle
int hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
uint uFlags); // window positioning flags


const uint SWP_NOSIZE = 0x1;
const uint SWP_NOMOVE = 0x2;
const uint SWP_SHOWWINDOW = 0x40;
const uint SWP_NOACTIVATE = 0x10;

并调用它是这样的:

SetWindowPos((int)form.Handle,   // that form
             (int)insertAfter.Handle,  // some other control
             0, 0, 0, 0,
             SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE);


Answer 7:

他们展示后每个子窗体调用BringToFront()。 或者,它勾到每个子窗体的OnLoad方法:

childForm.OnLoad += (s, e) => (s as Form).BringToFront();


Answer 8:

我有这个问题,解决它是这样的:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

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

    private void Form1_Load(object sender, EventArgs e)
    {
        Panel P1 = new Panel();
        P1.Location = new Point(0, 0);
        P1.Height = this.Height;
        P1.Width = this.Width;
        P1.BackColor = Color.Transparent;
        this.Controls.Add(P1);

        SetParent(F2.Handle, P1.Handle);
        F2.Owner = this;

        F2.Show();
    }
}


文章来源: Controls in container form come over child form?