如何在ContextMenu上添加背景色和前景色
本文关键字:背景色 前景色 添加 ContextMenu | 更新日期: 2023-09-27 18:29:19
每当用户右键单击DataGridView
中的特定位置时,我都会显示ContextMenu
。我希望ContextMenu
的项目根据其内容有背景色和背景色。
既然ContextMenu
没有背景色或前景色属性,我该怎么做?我试着查找ContextMenuStrip
,但它必须连接到我没有也不想要的ToolStripButton
。
为了更改MenuItem
的背景色,您需要指定一个绘制项目处理程序,并将每个项目的所有者绘制设置为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处理程序就知道占用的空间有多大
我允许自己挖掘这篇文章,因为我遇到了同样的问题(在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));
myToolStripMenuItem.GetCurrentParent().BackColor=Color.Red