如何在右键菜单中添加背景色和前景色

3
每当用户在 DataGridView 的特定位置右键单击时,我会显示一个 ContextMenu。我希望该 ContextMenu 中的项目根据其内容具有背景色和前景色。
由于 ContextMenu 没有背景色或前景色属性,因此我该如何做呢?我试图查找 ContextMenuStrip,但这必须连接到我没有也不想要的 ToolStripButton

1
使用ContextMenuStrip代替,并提供自己的颜色表。参考链接:https://dev59.com/QGox5IYBdhLWcg3wWjHQ#9260827。 - Hans Passant
我找到了一个解决方案,使用了我目前正在使用的drawItem处理程序。该应用程序非常依赖于ContextMenus,更改为其他内容意味着更改数百行代码,而使用此方法只需添加处理程序即可。 - John Demetriou
3个回答

5
要更改MenuItem的背景颜色,您需要指定一个绘制项处理程序,并为每个项设置owner-draw为true。此外,为了使颜色实际占用一些空间,您需要实现一个MeasureMenuItem处理程序。
例如:
                color.MenuItems.Add(new MenuItem("#123456", menuHandler));
                color.MenuItems.Add(new MenuItem("Green", menuHandler));
                color.MenuItems.Add(new MenuItem("Red", menuHandler));
                foreach (MenuItem item in color.MenuItems)
                {
                    item.OwnerDraw = true;
                    item.DrawItem += item_DrawItem;
                    item.MeasureItem += MeasureMenuItem;
                }

以上代码将项目和它们的处理程序连接起来。
void item_DrawItem(object sender, DrawItemEventArgs e)
        {
            MenuItem cmb = sender as MenuItem;
            string color = SystemColors.Window.ToString();
            if (e.Index > -1)
            {
                color = cmb.Text;
            }
            if (checkHtmlColor(color))
            {

                e.DrawBackground();
                e.Graphics.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(color)), e.Bounds);

                e.Graphics.DrawString(color, new Font("Lucida Sans", 10), new SolidBrush(ColorTranslator.FromHtml(color)), e.Bounds);

            }
        }

上面的代码将 MenuItem 的内容转换为颜色,创建一个矩形并绘制它。
   void MeasureMenuItem(object sender, MeasureItemEventArgs e)
        {
            MenuItem m = (MenuItem)sender;
            Font font = new Font(Font.FontFamily, Font.Size, Font.Style);
            SizeF sze = e.Graphics.MeasureString(m.Text, font);
            e.ItemHeight = (int)sze.Height;
            e.ItemWidth = (int)sze.Width;
        }

最后,以上几行代码只是测量 MenuItem 在绘制前应该占据的区域(基本上测量其字符串内容的空间),以便 draw_item 处理程序知道需要占用多少空间。

3

我允许自己挖掘这篇文章,因为我曾经遇到了同样的问题(如何在ContextMenu中为MenuItem添加背景颜色),并找到了这篇文章。但答案似乎很复杂。因此,我继续搜索并找到了一个更简单的解决方案:使用ContextMenuStrip和ToolStripMenuItem。以下是一个示例,适用于遇到相同问题的用户:

ContextMenuStrip cMenu=new ContextMenuStrip();
ToolStripMenuItem mi;
// Item 1, null in constructor to say : no picture on the label
mi=new ToolStripMenuItem("item 1",null , (s,a)=> actionOnClicItem1());
mi.BackColor = Color.Red;
cMenu.Items.add(mi);

// Separator
cMenu.Items.Add(new ToolStripSeparator());

// Item 2
mi=new ToolStripMenuItem("item 2",null , (s,a)=> actionOnClicItem2());
mi.BackColor = Color.Blue;
cMenu.Items.add(mi);

// show the context menu near by the mouse pointer
cMenu.Show(myDataGridView,new Point(e.X,e.Y));

0

myToolStripMenuItem.GetCurrentParent().BackColor = Color.Red

我的ToolStripMenuItem.GetCurrentParent().BackColor = Color.Red


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接