如何在ContextMenu上添加前后颜色

Joh*_*iou 1 .net c# datagridview winforms

ContextMenu每当用户右键单击中的特定位置时,我都会显示一个DataGridView。我希望其中的项目ContextMenu根据其内容具有背景色和前景色。

由于ContextMenu没有背景色或原色属性,该怎么办?我尝试查找,ContextMenuStrip但是必须将其连接到ToolStripButton我没有和不想要的地方。

Joh*_*iou 5

为了更改a的背景色,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;
                }
Run Code Online (Sandbox Code Playgroud)

上面的代码连接了项目及其处理程序。

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

            }
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码获取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;
        }
Run Code Online (Sandbox Code Playgroud)

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