2009-01-19 24 views
7

En una aplicación de Windows Forms, configuré la propiedad ContextMenuStrip en un TabControl.Menú contextual de TabControl

  1. ¿Cómo puedo decir que el usuario ha hecho clic en una pestaña que no sea la que está actualmente seleccionada?
  2. ¿Cómo puedo restringir que el menú contextual se muestre solo cuando se hace clic en la parte superior de la pestaña con la etiqueta, y no en otra parte de la pestaña?

Respuesta

10

No moleste en configurar la propiedad contextMenuStrip en TabControl. Más bien hazlo de esta manera. Conéctese al evento mouseClick de tabControl y luego muestre manualmente el menú contextual. Esto solo se activará si se hace clic en la pestaña en la parte superior, no en la página real. Si hace clic en la página, entonces tabControl no recibe el evento click, el TabPage sí. Algunos código:

public Form1() 
{ 
    InitializeComponent(); 
    this.tabControl1.MouseClick += new MouseEventHandler(tabControl1_MouseClick); 
} 

private void tabControl1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     this.contextMenuStrip1.Show(this.tabControl1, e.Location); 
    } 


} 
+0

esto no va a responder a la tecla del teclado menú contextual. – user1318499

2

Un poco tarde, pero he encontrado una solución para la primera parte de su pregunta. Puede averiguar en qué pestaña se hizo clic derecho al enviar un clic con el botón izquierdo del mouse a la aplicación. Esto selecciona la pestaña, por lo que ahora puede usar la propiedad TabControl.SelectedTab para obtener la pestaña en la que el usuario hizo clic derecho.

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
    private static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 

    private const int MOUSEEVENTF_LEFTDOWN = 0x02; 
    private const int MOUSEEVENTF_LEFTUP = 0x04; 
    private const int MOUSEEVENTF_RIGHTDOWN = 0x08; 
    private const int MOUSEEVENTF_RIGHTUP = 0x10; 

    private static void SendLeftMouseClick() 
    { 
     int x = Cursor.Position.X; 
     int y = Cursor.Position.Y; 
     mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0); 
    } 

    public Form1() 
    { 
     InitializeComponent(); 

     tabControl1.MouseDown += new MouseEventHandler(tabControl1_MouseDown); 
     tabControl1.MouseUp += new MouseEventHandler(tabControl1_MouseUp); 
    } 

    void tabControl1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      // Send a left mouse click to select the tab that the user clicked on. 
      SendLeftMouseClick(); 
     } 
    } 

    void tabControl1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      // To show a context menu for only the tab button but not the content of the tab, 
      // we must show it in the tab control's mouse up event. 
      contextMenuStrip1.Show((Control)sender, e.Location); 
     } 
    } 
10

evento de Apertura de menú contextual se puede utilizar para resolver ambos problemas

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
{    
    Point p = this.tabControl1.PointToClient(Cursor.Position); 
    for (int i = 0; i < this.tabControl1.TabCount; i++) 
    { 
     Rectangle r = this.tabControl1.GetTabRect(i); 
     if (r.Contains(p)) 
     { 
      this.tabControl1.SelectedIndex = i; // i is the index of tab under cursor 
      return; 
     } 
    } 
    e.Cancel = true; 
} 
+0

Esta respuesta s/b aceptada ya que responde ambas preguntas correctamente. – transistor1

0

que estaba buscando una solución para el mismo problema. Después de probar las dos respuestas @nisar y @BFree Vine a este (también tuve la tabcontrol en algún lugar dentro de un panel en el formulario):

//Create tabcontrol1 
    //asociate with MouseClick event bellow 
    //create contextMenuTabs ContextMenuStrip 

    private void tabControl1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      Point ee = new Point(e.Location.X - panel1.Left, e.Location.Y - panel1.Top); 
      for (int i = 0; i < this.tabControl1.TabCount; i++) 
      { 
       Rectangle r = this.tabControl1GetTabRect(i); 
       if (r.Contains(ee)) 
       { 
        if (this.tabControl1.SelectedIndex == i) 
         this.contextMenuTabs.Show(this.tabControl1, e.Location); 
        else 
         { 
          //if a non seelcted page was clicked we detected it here!! 
         } 

        break; 
       } 
      } 
     } 

    } 
Cuestiones relacionadas