2009-01-19 39 views
7

在Windows窗体应用程序中,我在TabControl上设置ContextMenuStrip属性。TabControl上下文菜单

  1. 我该如何告诉用户点击了其他当前选中的选项卡?
  2. 如何限制上下文菜单仅在带有标签的顶部选项卡部分被点击时才显示,而不是在选项卡中的其他位置?

回答

10

不要打扰在TabControl上设置contextMenuStrip属性。而是这样做。连接到tabControl的MouseClick事件,然后手动显示上下文菜单。如果点击顶部的选项卡而不是实际页面,则只会触发此选项。如果你点击页面,那么TabControl不会收到点击事件,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); 
    } 


} 
+0

这不会上下文菜单键盘按键响应。 – user1318499 2017-01-30 06:23:29

2

有点晚了,但我找到了问题的第一部分的解决方案。您可以通过向应用程序发送鼠标左键来确定右键单击哪个选项卡。这将选择该选项卡,因此现在您可以使用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); 
     } 
    } 
10

开幕活动,以解决这两个问题

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

这个s/b接受的答案,因为它正确回答这两个问题。 – transistor1 2012-09-28 18:17:50

0

我一直在寻找的确切同样的问题的解决方案。测试我来到这个既@nisar和@BFree应答后(我也有tabcontrol的形式panel内某处):

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

    }