Question

Dans une application Windows Forms, je définis la propriété ContextMenuStrip sur un TabControl.

  1. Comment savoir si l'utilisateur a cliqué sur un onglet autre que celui actuellement sélectionné?
  2. Comment puis-je empêcher le menu contextuel de s'afficher uniquement lorsque la partie supérieure de l'onglet avec l'étiquette est cliquée, et pas ailleurs dans l'onglet?
Était-ce utile?

La solution

Ne vous inquiétez pas de la définition de la propriété contextMenuStrip sur le TabControl. Fais-le plutôt de cette façon. Connectez-vous à l'événement MouseClick de tabControl, puis affichez manuellement le menu contextuel. Cela ne se déclenchera que si l’onglet lui-même en haut est cliqué, pas la page réelle. Si vous cliquez sur la page, alors tabControl ne reçoit pas l'événement click, c'est TabPage. Un code:

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


}

Autres conseils

L'événement d'ouverture du menu contextuel peut être utilisé pour résoudre les deux problèmes

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

Un peu tard, mais j'ai trouvé une solution pour la première partie de votre question. Vous pouvez déterminer l'onglet sur lequel vous avez fait un clic droit en envoyant un clic gauche sur l'application. Cela sélectionne l'onglet. Vous pouvez donc maintenant utiliser la propriété TabControl.SelectedTab pour obtenir l'onglet sur lequel l'utilisateur a cliqué avec le bouton droit de la souris.

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

Je cherchais une solution au même problème.
Après avoir testé à la fois les réponses @nisar et @BFree, j'en suis venu à cela (j'avais également le TabControl` dans un panneau quelque part dans le formulaire):

  • Créer un tabcontrol1
  • Abonnez-vous à l'événement MouseClick
  • Créer des 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;
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top