如何在ContextMenu上添加Back和Fore Color

时间:2014-11-06 12:23:56

标签: c# .net winforms datagridview

每当用户右键点击ContextMenu中的特定位置时,我都会显示DataGridView。 我希望ContextMenu的项目具有背景色和前色,具体取决于其内容。

我怎么能这样做,因为ContextMenu没有背景色或前色属性? 我尝试查找ContextMenuStrip,但这必须连接到ToolStripButton,我没有,也不想要。

3 个答案:

答案 0 :(得分:3)

为了更改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处理程序知道占用多少空间

答案 1 :(得分:1)

我允许自己挖掘帖子因为我有同样的问题(在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));

答案 2 :(得分:0)

myToolStripMenuItem.GetCurrentParent()。BackColor = Color.Red