2009-01-19 64 views
7

Trong ứng dụng Windows Forms tôi đặt thuộc tính ContextMenuStrip trên TabControl.TabControl Menu ngữ cảnh

  1. Làm cách nào để tôi có thể thông báo cho người dùng đã nhấp vào tab khác, sau đó tab đó hiện được chọn?
  2. Làm cách nào để hạn chế menu ngữ cảnh chỉ hiển thị khi phần Tab trên cùng với nhãn được nhấp và không ở đâu khác trong tab?

Trả lời

10

Đừng bận tâm đặt bối cảnhMenuStrip thuộc tính trên TabControl. Thay vì làm theo cách này. Kết nối tới sự kiện MouseClick của tabControl và sau đó hiển thị menu ngữ cảnh theo cách thủ công. Điều này sẽ chỉ kích hoạt nếu chính tab trên đầu được nhấp vào, không phải là trang thực. Nếu bạn nhấp vào trang, thì tabControl không nhận được sự kiện nhấp chuột, TabPage sẽ thực hiện. Một số mã:

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

này sẽ không đáp ứng với phím bàn phím menu ngữ cảnh. – user1318499

2

Một chút trễ, nhưng tôi đã tìm thấy giải pháp cho phần đầu tiên của câu hỏi của bạn. Bạn có thể tìm ra tab nào đã được nhấp chuột phải bằng cách nhấp chuột trái vào ứng dụng. Điều này chọn tab, vì vậy bây giờ bạn có thể sử dụng thuộc tính TabControl.SelectedTab để nhận được tab mà người dùng đã nhấp chuột phải vào.

[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

khai mạc sự kiện của menu ngữ cảnh có thể được sử dụng để giải quyết cả hai vấn đề

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

Câu trả lời này chấp nhận câu trả lời vì nó trả lời chính xác cả hai câu hỏi. – transistor1

0

tôi đang tìm kiếm một giải pháp cho cùng một vấn đề chính xác. Sau khi thử nghiệm cả hai @nisar và @BFree câu trả lời tôi đến đây (Tôi cũng có tabcontrol bên trong một đâu đó panel theo hình thức):

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

    } 
Các vấn đề liên quan