2013-03-01 53 views
5

我在我的表单中添加了一个MenuStrip,并且我希望像通常那样在其下面添加其他控件。Point(0,0)是空白表单空间的左上角。将菜单添加到我的表单并添加更多控件后,它们相互重叠。所以我想拿走菜单的客户端矩形的一些高度,并且在菜单下面的Location = (0,0)的按钮必须是右边的如何为程序添加菜单带走垂直空间?

我该怎么做?

如果我将一个MainMenu分配给表单的Menu属性,它会自动执行,但我确实需要并且需要使用MenuStrip。


编辑:这不起作用:

MenuStrip menu = new MenuStrip(); 
menu.Items.Add("File"); 
menu.AutoSize = false; 
menu.Height = 50; 
menu.Dock = DockStyle.Top; 
MainMenuStrip = menu; 
Controls.Add(menu); 

Button b = new Button(); 
b.Text = "hello world"; 
b.SetBounds(0, 25, 128, 50); 
Controls.Add(b); 

虽然这就像我想它的MenuStrip做:

Menu = new MainMenu(); 
Menu.MenuItems.Add("File"); 

Button b = new Button(); 
b.Text = "hello world"; 
b.SetBounds(0, 0, 128, 50); 
Controls.Add(b); 
+0

您是否尝试使用Dock?如果使用DockStyle.Top将它们全部添加,它们将被垂直堆叠(不要忘记改变插入顺序以更改它们的索引)。 – 2013-03-01 13:02:29

+2

...顺便说一下:表单也有一个MainMenuStrip属性。 – 2013-03-01 13:08:12

+0

@Adriano是的,但它没有帮助。如果看到示例,该按钮将位于菜单下。 – Bitterblue 2013-03-01 13:21:25

回答

1

当你SetBounds(0, 25, 128, 50),你实际上是设置b.Top25(第二个参数)。为了将顶部结合相对于menu控制,使用设置:

b.SetBounds(0, menu.Bottom, 128, 50); 

[UPDATE]

备选地,可以使用:

public partial class Form1 : Form 
{ 
    private int menuStripHeight = 50; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.ControlAdded += Form1_ControlAdded; 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     MenuStrip menu = new MenuStrip(); 
     menu.Items.Add("File"); 
     menu.AutoSize = false; 
     menu.Height = menuStripHeight; ; 
     menu.Dock = DockStyle.Top; 
     MainMenuStrip = menu; 
     Controls.Add(menu); 

     Button b = new Button(); 
     b.Text = "hello world"; 

     // note that the position used is 0,0 
     b.SetBounds(0, 0, 128, 50); 

     Controls.Add(b); 
    } 

    void Form1_ControlAdded(object sender, ControlEventArgs e) 
    { 
     if (e.Control.GetType().FullName != "System.Windows.Forms.MenuStrip") 
      e.Control.Top += menuStripHeight; 
    } 
} 

[UPDATE 2]

或者您可以使用Panel

MenuStrip menu = new MenuStrip(); 
menu.Items.Add("File"); 
menu.AutoSize = false; 
menu.Height = menuStripHeight; ; 
menu.Dock = DockStyle.Top; 
MainMenuStrip = menu; 
Controls.Add(menu); 

Panel p = new Panel(); 
p.SetBounds(0, menuStripHeight, this.Width, this.Height); 
Controls.Add(p); 

Button b = new Button(); 
b.Text = "hello world"; 
p.Controls.Add(b); 
b.SetBounds(0, 0, 128, 50); 
+0

我知道我在那里做什么。但我需要新的控制y位置设置为0,并在菜单下。它必须是MenuStrip。我希望这有一个小窍门。 – Bitterblue 2013-03-01 13:31:50

+0

更新是一个有趣的想法,但当我在添加后设置我的控件的位置时,它不起作用(我肯定会这样做)。或者你也有解决的办法吗? – Bitterblue 2013-03-01 14:02:26

+1

您是否需要直接将控件添加到窗体的控件集合中?为什么不在菜单条下使用'Panel'并将所有控件添加到它?这样,你应该得到所需的用法。 – 2013-03-01 14:12:56

1

在MenuStrip和Panel中均使用DockStyle.Top,但按相反顺序添加它们。使用Dock = Top添加一个控件可以将最后一个控件放在最接近边框的位置,也就是所有其他控件的顶部。因此,不诉诸私人常数和事件处理程序:

MenuStrip menu = new MenuStrip() { 
    AutoSize = false, 
    Dock = DockStyle.Top 
}; 
menu.Items.Add("File"); 

Panel p = new Panel(){ 
    Dock = DockStyle.Top 
}; 

Controls.Add(p); 
Controls.Add(menu); 
MainMenuStrip = menu; 

Button b = new Button(){ 
    Text = "hello world" 
}; 
p.Controls.Add(b); 
b.SetBounds(0, 0, 128, 50);