c# - एक आइटम पर एक सही क्लिक मेनू जोड़ना




winforms visual-studio menu right-click (5)

इस के साथ घूमने के बाद, यह जानने के लिए उपयोगी है कि एक्स / ईआई अंक नियंत्रण के सापेक्ष हैं, इसलिए यदि (जैसा मैं था) आप एक सूचीई सूची को एक सूची दृश्य या कुछ इसी तरह जोड़ रहे हैं, तो आप इसे समायोजित करना चाहते हैं प्रपत्र की उत्पत्ति नीचे दिए गए उदाहरण में मैंने 20 से एक्स / वाई जोड़ा है ताकि मेनू दाहिनी ओर और कर्सर के नीचे दिखाई दे।

cmDelete.Show(this, new Point(e.X + ((Control)sender).Left+20, e.Y + ((Control)sender).Top+20));

मैं एक आइटम के लिए एक साधारण राइट-क्लिक मेनू के लिए थोड़ी देर खोज रहा हूं। उदाहरण के लिए, अगर मैं किसी तस्वीर पर राइट-क्लिक करता हूं तो मुझे अपने खुद के लेबल्स के साथ आने के लिए एक छोटा मेन्यू चाहिए: जोड़ें, निकालें आदि। अगर कोई मदद कर सकता है तो मैं सबसे ज्यादा मज़ेदार होगा।

तलाश के लिए धन्यवाद।

यहां पूरा कोड है:

    ContextMenu cm = new ContextMenu();             
    cm.MenuItems.Add("Item 1", new EventHandler(Removepicture_Click));             
    cm.MenuItems.Add("Item 2", new EventHandler(Addpicture_Click));              
    pictureBox1.ContextMenu = cm; 

यह इस प्रश्न का व्यापक उत्तर है। मैंने यह किया है क्योंकि यह पृष्ठ Google खोज परिणामों पर उच्च है और जवाब पर्याप्त विस्तार में नहीं आता है। यह पोस्ट मानता है कि आप विजुअल स्टूडियो सी # फ़ॉर्म का इस्तेमाल करने में सक्षम हैं। यह वीएस2012 पर आधारित है

  1. फ़ॉर्म पर एक प्रसंग मेन्यूस्ट्रिप को खींचकर प्रारंभ करें यह सिर्फ उसे शीर्ष बाएं कोने में रखेगा जहां आप अपने मेनू आइटम जोड़ सकते हैं और इसे फिट मानकर इसे नाम बदलें।

  2. आपको कोड देखना होगा और प्रपत्र पर खुद को एक घटना में दर्ज करना होगा। प्रश्न में आइटम के लिए एक माउस डाउन इवेंट बनाएं और उसके बाद इसके लिए एक राइट क्लिक इवेंट असाइन करें (मैंने "मेन्यूस्ट्रिप" ContextMenuStrip कहा है):

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
    switch (e.Button)
        {
            case MouseButtons.Right:
            {
                rightClickMenuStrip.Show(this, new Point(e.X, e.Y));//places the menu at the pointer position
            }
            break;
        }
    }
  3. ईवेंट हैंडलर मैन्युअल रूप से form.designer पर निरुपित करें (आपको सिस्टम। Windows.Forms के लिए "उपयोग" जोड़ने की आवश्यकता हो सकती है; आप इसे अभी हल कर सकते हैं):

    this.pictureBox1.MouseDown += new MouseEventHandler(this.pictureBox1_MouseDown);
  4. इस बिंदु पर सभी की जरूरत है, प्रत्येक मेनू आइटम पर डबल क्लिक करें और प्रत्येक क्लिक ईवेंट के वांछित कार्यों को उसी तरह उसी तरीके से करें, जैसे आप किसी अन्य बटन के लिए करते हैं।

यह इस ऑपरेशन के लिए बुनियादी कोड है। आप स्पष्ट रूप से अपने कोडन प्रथाओं के साथ फिट करने के लिए इसे संशोधित कर सकते हैं।


यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं, तो भी एक जीयूआई समाधान है:

  1. टूलबॉक्स से एक संदर्भमेनूस्ट्रिप जोड़ें
  2. संदर्भ मेनू का चयन करें और सही क्लिक आइटम जोड़ें
  3. प्रत्येक आइटम के लिए संबंधित ईवेंट में क्लिक ईवेंट सेट करें
  4. फ़ॉर्म / बटन / छवि / आदि (किसी भी आइटम) का चयन करें कि सही क्लिक मेनू कनेक्ट हो जाएगा
  5. अपनी कॉन्टेक्स्ट मेन्यूस्ट्रिप संपत्ति को आपके द्वारा बनाए गए मेनू में सेट करें

अपने फ़ॉर्म में एक संदर्भमेनू जोड़ें और फिर उसे कॉन्टेक्स्टमेनूस्ट्रिप के तहत नियंत्रण के गुणों में आवंटित करें उम्मीद है की यह मदद करेगा :)।

उम्मीद है की यह मदद करेगा:

ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("Item 1");
cm.MenuItems.Add("Item 2");

pictureBox1.ContextMenu = cm;

एक टिप्पणी के कारण, संपादित करें:

में:

protected override void OnClick(EventArgs e)
{
    if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
    {
        base.OnClick(e);
    }
}

यह भाग

 MouseButtons != MouseButtons.Right

इसे नियंत्रित करना चाहिए और संकलित करना क्योंकि यह नियंत्रण के लिए कॉल है। म्यूज़बुटन्स। चूंकि प्रपत्र नियंत्रण वर्ग को विरासत में लेता है, चूंकि यह MouseButtons संपत्ति सीधे कॉल करने के लिए पर्याप्त है।

उम्मीद है की यह मदद करेगा:

public partial class Form1 : Form
{
    class CustomToolStripMenuItem : ToolStripMenuItem
    {
        private ContextMenuStrip secondaryContextMenu;

        public ContextMenuStrip SecondaryContextMenu
        {
            get
            {
                return secondaryContextMenu;
            }
            set
            {
                secondaryContextMenu = value;
            }
        }

        public CustomToolStripMenuItem(string text)
            : base(text)
        { }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (secondaryContextMenu != null)
                {
                    secondaryContextMenu.Dispose();
                    secondaryContextMenu = null;
                }
            }

            base.Dispose(disposing);
        }

        protected override void OnClick(EventArgs e)
        {
            if (SecondaryContextMenu == null || MouseButtons != MouseButtons.Right)
            {
                base.OnClick(e);
            }
        }
    }

    class CustomContextMenuStrip : ContextMenuStrip
    {
        private bool secondaryContextMenuActive = false;
        private ContextMenuStrip lastShownSecondaryContextMenu = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (lastShownSecondaryContextMenu != null)
                {
                    lastShownSecondaryContextMenu.Close();
                    lastShownSecondaryContextMenu = null;
                }
            }
            base.Dispose(disposing);
        }

        protected override void OnControlAdded(ControlEventArgs e)
        {
            e.Control.MouseClick += new MouseEventHandler(Control_MouseClick);
            base.OnControlAdded(e);
        }

        protected override void OnControlRemoved(ControlEventArgs e)
        {
            e.Control.MouseClick -= new MouseEventHandler(Control_MouseClick);
            base.OnControlRemoved(e);
        }

        private void Control_MouseClick(object sender, MouseEventArgs e)
        {
            ShowSecondaryContextMenu(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            ShowSecondaryContextMenu(e);
            base.OnMouseClick(e);
        }

        private bool ShowSecondaryContextMenu(MouseEventArgs e)
        {
            CustomToolStripMenuItem ctsm = this.GetItemAt(e.Location) as CustomToolStripMenuItem;

            if (ctsm == null || ctsm.SecondaryContextMenu == null || e.Button != MouseButtons.Right)
            {
                return false;
            }

            lastShownSecondaryContextMenu = ctsm.SecondaryContextMenu;
            secondaryContextMenuActive = true;
            ctsm.SecondaryContextMenu.Closed += new ToolStripDropDownClosedEventHandler(SecondaryContextMenu_Closed);
            ctsm.SecondaryContextMenu.Show(Cursor.Position);
            return true;
        }

        void SecondaryContextMenu_Closed(object sender, ToolStripDropDownClosedEventArgs e)
        {
            ((ContextMenuStrip)sender).Closed -= new ToolStripDropDownClosedEventHandler(SecondaryContextMenu_Closed);
            lastShownSecondaryContextMenu = null;
            secondaryContextMenuActive = false;
            Focus();
        }

        protected override void OnClosing(ToolStripDropDownClosingEventArgs e)
        {
            if (secondaryContextMenuActive)
            {
                e.Cancel = true;
            }

            base.OnClosing(e);
        }
    }

    public Form1()
    {
        InitializeComponent();


        CustomToolStripMenuItem itemPrimary1 = new CustomToolStripMenuItem("item primary 1");
        itemPrimary1.SecondaryContextMenu = new ContextMenuStrip();
        itemPrimary1.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
            new ToolStripMenuItem("item primary 1.1"),
            new ToolStripMenuItem("item primary 1.2"),
        });

        CustomToolStripMenuItem itemPrimary2 = new CustomToolStripMenuItem("item primary 2");
        itemPrimary2.DropDownItems.Add("item primary 2, sub 1");
        itemPrimary2.DropDownItems.Add("item primary 2, sub 2");
        itemPrimary2.SecondaryContextMenu = new ContextMenuStrip();
        itemPrimary2.SecondaryContextMenu.Items.AddRange(new ToolStripMenuItem[] { 
            new ToolStripMenuItem("item primary 2.1"),
            new ToolStripMenuItem("item primary 2.2"),
        });

        CustomContextMenuStrip primaryContextMenu = new CustomContextMenuStrip();
        primaryContextMenu.Items.AddRange(new ToolStripItem[]{
            itemPrimary1,
            itemPrimary2
        });

        this.ContextMenuStrip = primaryContextMenu;
    }
}




c# winforms visual-studio menu right-click