c# - 如何在上下文菜单中添加背景色和前景色

标签 c# .net winforms datagridview

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

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

最佳答案

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

关于c# - 如何在上下文菜单中添加背景色和前景色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779418/

相关文章:

c# - 如何根据年份获取一个月中的总天数?

c# - 将 ItemsControl 绑定(bind)到 ObservableCollection<T> 是否比 List<T> 更有效?

c# - 简单注入(inject)器和 SolrNet

c# - Android中DataInputStream只接收2048字节的数据吗?

c# - 如果没有路由匹配,为什么 ASP.NET WebApi 会清除身份?

c# - 如何获取当前帧?

c# - FlowLayoutPanel 中的新行

C# SQL 分布式事务已完成。在新事务或 NULL 事务中登记此 session

vb.net - 使用 VB.NET 表单上传和下载到 Google Drive

c# - 带分隔符的字节正则表达式