2009-10-11 15 views

Respuesta

20

lo he descubierto:

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

Estrictamente hablando, esto no es la respuesta a la pregunta. Esto mostrará el menú contextual en la ubicación del puntero, no en el punto justo debajo del botón. –

+0

Llegué aquí buscando exactamente esto. ¡¡Gracias!! –

+0

El método ContextMenu.Show() tiene varias sobrecargas; en su caso, una buena solución sería esta: coloca el menú contextual _relativo a su botón_. 'layoutMenus.Show (Button1, new Point (0, Button1.Height))' – AeonOfTime

1

Asegúrese de que cuando se está posicionando en el menú contextual que se le pasa las coordenadas de pantalla correctas. Tendrá que usar algo como Control.PointToScreen, usando las coordenadas x, y, basadas en la posición del control en su padre.

33

Sé que esto es una vieja pregunta, pero creo que puede ayudar a otras personas. El siguiente código mostrará el menú contextual justo debajo del botón al que se hace clic y el botón se verá como un botón desplegable.

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

¡este es el comportamiento que estoy buscando en su solución! No puedo descifrar cómo hacerlo dentro de la anulación protegida OnMouseClick (DataGridViewCellMouseEventArgs e) ... Estoy tratando de colocar una ContextMenuStrip justo debajo de mi dataGridViewCell. –

+0

@ D. Allen: parece que está hablando de la clase DataGridView en .NET y está anulando el evento OnCellMouseClick en su clase heredada de DataGridView. Si es así, ¿podría describir qué es exactamente lo que quiere hacer?Creo que puede obtener la ubicación, las coordenadas X/Y del objeto DataGridViewCellMouseEventArgs –

+0

Esta solución no cubre un caso extremo donde colocamos el botón cerca de la barra de tareas y luego hacemos clic para mostrar la franja del menú contextual. A veces, la tira del menú ocultará el botón debido al desbordamiento, mientras que el comportamiento 'esperado' debe estar volteando el menú y luego encima del botón. Pero no hay una manera fácil de lograr ese cambio. –

-1

manera fácil

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

+0

No lo hace trabajo en absoluto. –

3

Por lo que yo sé el código que necesita era aquí:

// A la derecha del botón

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

En la parte inferior del botón

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

En la parte inferior derecha del botón

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

¿Qué es 'esto' aquí? ¿Te refieres a la forma en sí? El cálculo no funciona y el menú aparece en una ubicación inesperada. –

1

Estoy teniendo toolstripDropDown y después de hacer clic en el botón toolstripDropDown quise mostrar el menú contextual. Por lo tanto, a partir de los comentarios anteriores modifiqué mi código en el evento toolStripDropDown_Openining de la siguiente manera. funciona bien.

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 debajo del botón, alineado a la parte derecha del botón (se expande a continuación el botón a la izquierda): ContexMenuName.Show(ButtonName, new Point(ButtonName.Width - ContexMenuName.Width, ButtonName.Height)); Esperamos que esto ayude :) SB

+0

Estoy usando la solución @ saper_2 y funciona perfectamente bien para mí. –

Cuestiones relacionadas