C# 使用c的Winform上下文菜单#
我需要在Winform应用程序中使用上下文菜单。请注意,它需要是一个ContextMenu,而不是ContextMenuStrip。ContextMenu的问题是,我没有看到任何方法或属性来设置字体并在菜单项旁边显示图像/图标,这在ContextMenuStrip中很容易C# 使用c的Winform上下文菜单#,c#,winforms,C#,Winforms,我需要在Winform应用程序中使用上下文菜单。请注意,它需要是一个ContextMenu,而不是ContextMenuStrip。ContextMenu的问题是,我没有看到任何方法或属性来设置字体并在菜单项旁边显示图像/图标,这在ContextMenuStrip中很容易 是否可以在ContextMenu中设置字体并在菜单项旁边显示图像/图标?默认ContextMenu不提供此功能。如果需要此功能,您应该创建自己的自定义菜单项,或者可以在事件处理程序中启用项的模式并进行手动绘制: var ite
是否可以在ContextMenu中设置字体并在菜单项旁边显示图像/图标?默认ContextMenu不提供此功能。如果需要此功能,您应该创建自己的自定义菜单项,或者可以在事件处理程序中启用项的模式并进行手动绘制:
var item = new MenuItem("foo");
item.OwnerDraw = true;
item.DrawItem += item_DrawItem;
顺便说一句,您还需要处理MeasureItem事件,以提供您将手动绘制的项目的大小。例如,创建斜体字体
void item_MeasureItem(object sender, MeasureItemEventArgs e)
{
var item = (MenuItem)sender;
var g = e.Graphics;
Font font = new Font("Arial", 10, FontStyle.Italic);
e.ItemWidth = 200;
var size = g.MeasureString(item.Text, font, e.ItemWidth);
e.ItemHeight = (int)size.Height;
}
void item_DrawItem(object sender, DrawItemEventArgs e)
{
var item = (MenuItem)sender;
var g = e.Graphics;
var font = new Font("Arial", 10, FontStyle.Italic);
var brush = new SolidBrush(e.ForeColor);
g.DrawString(item.Text, font, brush, e.Bounds.X, e.Bounds.Y);
}
以及增加项目:
ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
item.OwnerDraw = true;
item.MeasureItem += item_MeasureItem;
item.DrawItem += item_DrawItem;
}
ContextMenu = new ContextMenu(new []{
new MenuItemWithItalicFont("foo"),
new MenuItemWithItalicFont("bar")});
与自定义菜单项类相同:
public class MenuItemWithItalicFont : MenuItem
{
private Font font;
public MenuItemWithItalicFont(string text)
: base(text)
{
OwnerDraw = true;
font = new Font("Arial", 10, FontStyle.Italic);
}
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
var g = e.Graphics;
e.ItemWidth = 200;
var size = g.MeasureString(Text, font, e.ItemWidth);
e.ItemHeight = (int)size.Height;
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
var g = e.Graphics;
var brush = new SolidBrush(e.ForeColor);
g.DrawString(Text, font, brush, e.Bounds.X, e.Bounds.Y);
}
}
添加项目:
ContextMenu = new ContextMenu(new []{new MenuItem("foo"), new MenuItem("bar")});
foreach (MenuItem item in ContextMenu.MenuItems)
{
item.OwnerDraw = true;
item.MeasureItem += item_MeasureItem;
item.DrawItem += item_DrawItem;
}
ContextMenu = new ContextMenu(new []{
new MenuItemWithItalicFont("foo"),
new MenuItemWithItalicFont("bar")});
注意实际上ContextMenu已被ContextMenuStrip控件替换,如果需要此功能,则应使用新控件。旧的ContextMenu仍然存在,主要是为了向后兼容: 保留ContextMenu是为了向后兼容和将来使用 如果您选择,请使用
你能解释一下为什么不使用ContextMenuStrip吗?@Asaf我更喜欢旧ContextMenu的外观和感觉