在容器中,形式我有菜单和按钮打开疗法形式。
在这里,我面临的一个问题,当我打开任何形式的这些buttns和标贴过来新开的形式。
请指导我如何管理这个问题? 我想开一个新的形式,并保持这些容器窗体的控件中的回地面。
在容器中,形式我有菜单和按钮打开疗法形式。
在这里,我面临的一个问题,当我打开任何形式的这些buttns和标贴过来新开的形式。
请指导我如何管理这个问题? 我想开一个新的形式,并保持这些容器窗体的控件中的回地面。
我也得到了同样的问题。 我得到了一个替代解决方案如下所述:
并做了以下
private void timer1_Tick(object sender, EventArgs e) { if ((int)MdiChildren.GetLength(0) > 0) { panel1.Visible = false; } else { panel1.Visible = true; } }
我想我看到你做了什么。 您正在使用MDI,你把菜单标签和按钮的MDI父窗体上。 你做了一件与MDI客户端窗口,它通常是暗灰色。 也许你想出如何改变其背景色或更改Windows系统颜色。 是的,你的屏幕截图它的结果。 问题是,MDI客户端形式的父级MDI客户端窗口。 这使得它们显示你把父窗体上的控件后面 。
有没有办法解决这个,你将不得不改变你的UI。 为了保持MDI,把面板父窗体上和它的Dock属性设置为Left。 在移动的菜单控件。 MDI客户端窗口将缩小,占据父窗体的其余部分。 和子窗体将限制自己该区域。 凌晨痛苦的一点是,你必须重新组织菜单,以适应在面板中的更小的空间。
如果它是一个MDI的应用程序,你把控件的父窗口,然后他们会在任何创建的子窗口的顶部显示。 你需要有你的菜单中的一个子窗口也没有父窗体上。
看看这个文章和这个 。
expecially这样的:
父窗体可能不包含任何控件。 >
编辑:添加附加信息
@Hans帕桑特有正确的答案,但你也可以不使用MDI形式在所有解决您的问题。 一些选项:
Parent
属性菜单形式,或 这两个需要你的UI代码显著的变化,虽然。
这里主要的窍门是治疗小儿形式控制。 您将创建一个子窗体就像任何其他的控制。 当您使用此方法,你必须设置它的顶级假 - 否则将无法正常工作。
下面的代码行用于创建一个子窗体:
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.
更多的细节在这里
看来好像这种形式是与其他子控件的兄弟姐妹。 你必须打开它作为窗口的子? 不能把它像一个非模态对话框,不是主窗体的子窗口?
如果它必须是主要形式和这些控件的兄弟姐妹中,那么你将不得不设置它的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);
他们展示后每个子窗体调用BringToFront()。 或者,它勾到每个子窗体的OnLoad方法:
childForm.OnLoad += (s, e) => (s as Form).BringToFront();
我有这个问题,解决它是这样的:
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();
}
}