2009-01-19 33 views
7

Bir Windows Forms uygulamasında, bir TabControl üzerinde ContextMenuStrip özelliğini ayarlıyorum.TabControl İçerik Menüsü

  1. Kullanıcının şu anda seçili olan bir sekmeyi tıklattığını nasıl anlarım?
  2. İçerik menüsünün, yalnızca etiketli üst Sekme kısmı tıklandığında ve sekmede başka bir yerde değilken gösterilmesini nasıl kısıtlayabilirim?

cevap

10

TabControl'de contextMenuStrip özelliğini ayarlamayı zahmet etmeyin. Bunun yerine bu şekilde yapın. TabControl'ün MouseClick olayına bağlanın ve daha sonra içerik menüsünü manuel olarak gösterin. Bu, yalnızca sekmenin kendisi üzerine tıklandığında gerçek sayfaya değil, yalnızca tetiklenir. Eğer sayfaya tıklarsanız, tabControl tıklama olayını alamaz, TabPage yapar. Bazı kod:

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

Bu içerik menüsü klavye tuşu yanıt vermez: Ben bu geldi hem @nisar ve @BFree cevapları test ettikten sonra (Ben de formda bir panel yere içeride tabcontrol vardı). – user1318499

2

Biraz geç ama Sorunuzun ilk bölümü için bir çözüm bulduk. Uygulamaya sol fare tıklaması göndererek hangi sekmenin sağ tıkladığını öğrenebilirsiniz. Bu sekmeyi seçer, böylece kullanıcının sağ tıkladığı sekmeyi almak için TabControl.SelectedTab özelliğini kullanabilirsiniz. Bağlam menüsünün

[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

Açılış olay Ben aynı sorun için bir çözüm arıyordu hem sorunları

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

Bu s/b yanıtı her iki soruyu da doğru bir şekilde cevapladığı için kabul etti. – transistor1

0

çözmek için kullanılabilir.

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

    }