2009-10-11 5 views

risposta

20

ho capito:

layoutMenus.Show(Cursor.Position.X, Cursor.Position.Y); 
+5

A rigor di termini, questa non è la risposta alla domanda Questo mostrerà il menu contestuale nella posizione del puntatore, non in un punto proprio sotto il pulsante. –

+0

Sono arrivato qui cercando esattamente questo. Grazie!! –

+0

Il metodo ContextMenu.Show() ha un numero di overload - nel tuo caso, una buona soluzione sarebbe questa: posiziona il menu contestuale _relativo al tuo pulsante_. 'layoutMenus.Show (Button1, new Point (0, Button1.Height))' – AeonOfTime

1

Assicurarsi che quando si sta posizionando il menu contestuale che si passa le coordinate dello schermo corretti. Avrai bisogno di usare qualcosa come Control.PointToScreen, usando le coordinate x, y, in base alla posizione del controllo nel suo genitore.

33

So che questa è una vecchia questione, ma penso che possa aiutare altre persone. Il codice seguente mostrerà il menu di scelta rapida appena sotto il pulsante su cui si fa clic e il pulsante apparirà come un pulsante a discesa.

private void Button1_Click(object sender, EventArgs e) 
{ 
    Button btnSender = (Button)sender; 
    Point ptLowerLeft = new Point(0, btnSender.Height); 
    ptLowerLeft = btnSender.PointToScreen(ptLowerLeft);   
    ctMenuStrip.Show(ptLowerLeft); 
} 
+0

questo è il comportamento che sto cercando nella tua soluzione! Non riesco a capire come farlo all'interno di override protetto OnMouseClick (DataGridViewCellMouseEventArgs e) ... Sto cercando di posizionare un ContextMenuStrip proprio sotto il mio dataGridViewCell. –

+0

@ D.Allen: Sembra che si stia parlando della classe DataGridView in .NET e si sta eseguendo l'override dell'evento OnCellMouseClick nella classe ereditata da DataGridView. Se è così allora potresti descrivere cosa esattamente vuoi fare.Penso che tu possa ottenere la posizione, le coordinate X/Y dall'oggetto DataGridViewCellMouseEventArgs –

+0

Questa soluzione non copre un caso limite in cui posizioniamo il pulsante vicino alla barra delle applicazioni e quindi fai clic su di esso per mostrare la striscia del menu contestuale. A volte la striscia di menu nasconderà il pulsante a causa di un overflow, mentre il comportamento 'previsto 'dovrebbe essere girando il menu e quindi sopra il pulsante. Ma non esiste un modo semplice per ottenere un simile lancio. –

-1

Modo semplice

contextMenuStrip1.Show (Button1, Button1.PointToClient (Cursor.Position));

+0

Non funziona lavorare affatto –

3

Per quanto ne so il codice si richiede è stato qui:

// Sulla destra del pulsante

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + this.Top); 

Nella parte inferiore del pulsante

ContextMenuName.Show(ButtonName.Left + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 

In basso a destra sul pulsante

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 
+0

Che cosa è questo qui? Intendi la forma stessa? Il calcolo non funziona e il menu appare in una posizione inaspettata. –

1

Sto avendo toolstripDropDown e dopo aver fatto clic sul pulsante toolstripDropDown ho voluto mostrare il menu di scelta rapida. Quindi, dai commenti precedenti ho modificato il mio codice nell'evento toolStripDropDown_Openining come segue. funziona bene.

void toolStripDropDownButton_DropDownOpening(object sender, EventArgs e) 
    { 


      ToolStripDropDownButton btnSender = (ToolStripDropDownButton)sender; 
      Point ptLowerRight = new Point(btnSender.Bounds.Right, btnSender.Bounds.Bottom); 
      ptLowerRight = PointToScreen(ptLowerRight); 
      contextMenuStrip.Show(ptLowerRight); 
    } 
4

ContexMenuName sotto il pulsante, allineato al lato destro del tasto (si espande per pulsante in basso a sinistra): ContexMenuName.Show(ButtonName, new Point(ButtonName.Width - ContexMenuName.Width, ButtonName.Height)); Spero che questo vi aiuterà sb :)

+0

Sto usando la soluzione @ saper_2 e funziona perfettamente bene per me. –