2013-03-01 8 views
5

Aggiungo un MenuStrip al mio modulo e vorrei aggiungere altri controlli sotto di esso come al solito Punto (0, 0) è l'angolo in alto a sinistra dello spazio vuoto del modulo. Dopo aver aggiunto il menu al mio modulo e aggiunto altri controlli, si sovrappongono a vicenda. Quindi voglio togliere qualche altezza del client rect per il menu e un pulsante con Location = (0,0) deve essere RIGHT sotto il menu.Come togliere lo spazio verticale per il menu aggiunto a livello di programmazione?

Come faccio?

Se si assegna una proprietà Menu principale alla proprietà del modulo, viene eseguita automaticamente ma io desidero e devo utilizzare MenuStrip.


Edit: questo non funziona:

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); 

Anche se questo funziona come vorrei che a che fare con 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

Hai provato a utilizzare Dock? Se li aggiungi tutti con DockStyle.Top verranno impilati verticalmente (non dimenticare di reverificare l'ordine di inserimento per cambiare il loro indice). –

+2

... a proposito: anche il Form ha una proprietà MainMenuStrip. –

+0

@Adriano Sì, ma non aiuta. Se vedi l'esempio il pulsante sarà sotto il menu. – Bitterblue

risposta

1

Quando si SetBounds(0, 25, 128, 50), in realtà si sta configurando b.Top a 25 (il secondo parametro). Al fine di impostare il relativo limite superiore per il menu di controllo, uso:

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

[UPDATE]

In alternativa, è possibile utilizzare:

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]

Oppure si può semplicemente usare un 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

So cosa sto facendo lì. Ma ho bisogno di nuovi controlli per avere la posizione y impostata su 0 e sotto il menu. E deve essere MenuStrip. Spero che ci sia un piccolo trucco per questo. – Bitterblue

+0

L'aggiornamento è un'idea interessante ma non funzionerà quando imposto la posizione dei miei controlli dopo l'aggiunta (e lo faccio sicuramente). O hai una soluzione anche per questo? – Bitterblue

+1

È necessario aggiungere i controlli direttamente alla raccolta di controlli del modulo? Perché non usi un 'Pannello 'sotto la striscia di menu e aggiungi tutti i controlli ad esso? In questo modo, dovresti ottenere l'utilizzo desiderato. –

1

Utilizzare DockStyle.Top in MenuStrip e nel Pannello, ma aggiungerli nell'ordine inverso. Aggiungendo un controllo con Dock = Top mette questo ultimo controllo più vicino al bordo, cioè sopra tutti gli altri controlli. Quindi, senza ricorrere a costanti private e gestori di eventi:

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); 
Problemi correlati