Контекстное меню TabControl - PullRequest
       24

Контекстное меню TabControl

7 голосов
/ 19 января 2009

В приложении Windows Forms я устанавливаю свойство ContextMenuStrip для TabControl.

  1. Как я могу сказать, что пользователь нажал на вкладку, отличную от той, которая выбрана в данный момент?
  2. Как ограничить показ контекстного меню только при нажатии верхней части вкладки с меткой, а не в других местах вкладки?

Ответы [ 4 ]

12 голосов
/ 19 января 2009

Не беспокойтесь о настройке свойства contextMenuStrip в TabControl. Скорее сделайте это так. Подключитесь к событию MouseClick tabControl, а затем вручную откройте контекстное меню. Это будет срабатывать только в том случае, если нажата сама вкладка вверху, а не сама страница. Если вы щелкаете по странице, то tabControl не получает событие click, а TabPage. Какой-то код:

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


}
11 голосов
/ 10 мая 2012

Событие открытия контекстного меню можно использовать для решения обеих проблем

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;
}
2 голосов
/ 18 июня 2011

Немного поздно, но я нашел решение для первой части вашего вопроса. Вы можете выяснить, на какой вкладке щелкнули правой кнопкой мыши, отправив левой кнопкой мыши приложение. При этом выбирается вкладка, поэтому теперь вы можете использовать свойство TabControl.SelectedTab, чтобы получить вкладку, по которой пользователь щелкнул правой кнопкой мыши.

    [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);
        }
    }
0 голосов
/ 22 июля 2016

Я искал решение для точно такой же проблемы.
После тестирования ответов @nisar и @BFree я пришел к этому (у меня также был TabControl` внутри панели где-то в форме):

  • Создать tabcontrol1
  • Подписаться на событие MouseClick
  • Создание 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;
            }
        }
    }
}
...