Как мигать или мигать ContextMenuStripItem при нажатии? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь дать пользователю визуальную подсказку, чтобы он мог видеть, что он щелкнул по определенной опции в ContextMenuStrip. Я предпочитаю мигающий или мигающий курсор (или цвет bg), например: https://imgur.com/a/S1uK6yE

Я попытался использовать ответ здесь: https://stackoverflow.com/a/11777092/10012792, но это ни к чему не приводит, так как он должен использоваться с toolstripButton, а не ContextMenuStrip toolstripMenuItem.

Мне интересно, должен ли я пойти «ответ на щелчок элемента ContextMenuStrip»: Как ответить на элемент ContextMenuStrip, щелкнуть

События кликов:

private void Option1_Click(object sender, EventArgs e)
        { try
            { }
            catch (Exception)
            { }
        }

        private void Option2_Click(object sender, EventArgs e)
        { try
            { }
            catch (Exception)
            { throw; }
        }

        private void Option3_Click(object sender, EventArgs e)
        { try
            { }
            catch (Exception ex)
            { }
        }

Дизайнер:

this.ctm_options.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(57)))), ((int)(((byte)(65)))));
            this.ctm_options.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.toolStripOption1,
            this.toolStripOption2,
            this.toolStripOption3,
            this.toolStripSeparator1});
            this.ctm_options.Name = "ctm_options";
            this.ctm_options.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
            this.ctm_options.Size = new System.Drawing.Size(181, 104);
            this.ctm_options.Opening += new System.ComponentModel.CancelEventHandler(this.ctm_options_Opening);

Имейте в виду, я использую пользовательский рендер, чтобы иметь возможность изменить цвет наведения, например, так:

public class MyRenderer : ToolStripProfessionalRenderer
        {
            public MyRenderer()
                : base(new MyColorTable())
            {
            }
            protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
            {
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                var r = new Rectangle(e.ArrowRectangle.Location, e.ArrowRectangle.Size);
                r.Inflate(-2, -6);
                e.Graphics.DrawLines(Pens.Black, new Point[]{
        new Point(r.Left, r.Top),
        new Point(r.Right, r.Top + r.Height /2),
        new Point(r.Left, r.Top+ r.Height)});
            }

            protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
            {
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                var r = new Rectangle(e.ImageRectangle.Location, e.ImageRectangle.Size);
                r.Inflate(-4, -6);
                e.Graphics.DrawLines(Pens.Black, new Point[]{
        new Point(r.Left, r.Bottom - r.Height /2),
        new Point(r.Left + r.Width /3,  r.Bottom),
        new Point(r.Right, r.Top)});
            }
        }

        public class MyColorTable : ProfessionalColorTable
        {
            public override Color MenuItemBorder
            {
                get { return Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215))))); ; }
            }
            public override Color MenuItemSelected
            {
                get { return Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(120)))), ((int)(((byte)(215))))); ; }
            }
            public override Color ToolStripDropDownBackground
            {
                get { return Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(57)))), ((int)(((byte)(65))))); ; }
            }
            public override Color ImageMarginGradientBegin
            {
                get { return Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(57)))), ((int)(((byte)(65))))); ; }
            }
            public override Color ImageMarginGradientMiddle
            {
                get { return Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(57)))), ((int)(((byte)(65))))); ; }
            }
            public override Color ImageMarginGradientEnd
            {
                get { return Color.FromArgb(((int)(((byte)(57)))), ((int)(((byte)(57)))), ((int)(((byte)(65))))); ; }
            }
        }
public Form()
        {
            InitializeComponent();
            this.ctm_options.Renderer = new MyRenderer();
        }

Как бы я использовал код toolstripButton, упомянутый ранее, чтобы он работал и для toolstripMenuItems? Или я должен подойти к этому другим методом?

...