سؤال

في نماذج Windows التطبيق تعيين ContextMenuStrip الملكية على TabControl.

  1. كيف يمكنني معرفة المستخدم بالنقر فوق علامة تبويب أخرى ثم واحد حاليا اختيار ؟
  2. كيف يمكنني تقييد قائمة السياق من تظهر فقط عند أعلى علامة التبويب جزء مع التسمية هو النقر ، وليس في أي مكان آخر في الحساب ؟
هل كانت مفيدة؟

المحلول

لا يكلف نفسه عناء وضع contextMenuStrip الملكية على TabControl.بدلا من أن تفعل ذلك بهذه الطريقة.هوك يصل إلى 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);
    }


}

نصائح أخرى

افتتاح الحدث من قائمة السياق يمكن استخدامها لحل كل المشاكل

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

في وقت متأخر قليلا, ولكني وجدت حل الجزء الأول من السؤال.يمكنك معرفة أي علامة تبويب كان على حق-النقر على إرسال الماوس الأيسر انقر فوق تطبيق.هذا بتحديد علامة التبويب حتى الآن يمكنك استخدام 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);
        }
    }

كنت أبحث عن حل لنفس المشكلة.
بعد اختبار كل من @نزار و @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;
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top