是否可以更改ToolStripMenuItem工具提示字体?

我有一个动态填充的ContextMenuStrip,其中每个ToolStripMenuItem都有一个工具提示的格式化文本。 并且,为了使该文本对用户有意义,我必须使用等宽字体,例如“Courier New”。 默认字体是常规非等宽字体。 我找不到ToolTip对象的任何getter,也没有找到覆盖Draw事件的方法,也没有办法设置它的样式。

那么,甚至可以更改ToolStripMenuItem的工具提示字体吗?

实现inheritance自ToolTip的CustomToolTip无法解决问题,即将新工具提示传递给ToolStripMenuItem。

好的,感谢Tony Abrams和William Andrus ,解决方案如下:

  • 初始化的ToolTip的静态实例。

     toolTip = new ToolTip(); toolTip.OwnerDraw = true; toolTip.Draw += new DrawToolTipEventHandler(tooltip_Draw); toolTip.Popup += new PopupEventHandler(tooltip_Popup); toolTip.UseAnimation = true; toolTip.AutoPopDelay = 500; toolTip.AutomaticDelay = 500; 
  • ToolTip的Popup事件设置其大小。

     void tooltip_Popup(object sender, PopupEventArgs e) { e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Courier New", 10.0f, FontStyle.Bold)); e.ToolTipSize = new Size(e.ToolTipSize.Width + TOOLTIP_XOFFSET, e.ToolTipSize.Height + TOOLTIP_YOFFSET); } 
  • 用于实际绘图的ToolTip的Draw事件。

     void tooltip_Draw(object sender, DrawToolTipEventArgs e) { Rectangle bounds = e.Bounds; bounds.Offset(TOOLTIP_XOFFSET, TOOLTIP_YOFFSET); DrawToolTipEventArgs newArgs = new DrawToolTipEventArgs(e.Graphics, e.AssociatedWindow, e.AssociatedControl, bounds, e.ToolTipText, toolTip.BackColor, toolTip.ForeColor, new Font("Courier New", 10.0f, FontStyle.Bold)); newArgs.DrawBackground(); newArgs.DrawBorder(); newArgs.DrawText(TextFormatFlags.TextBoxControl); } 
  • ToolStripMenuItem的MouseEnter事件显示工具提示。

     System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); toolTip.SetToolTip(item.Owner, "ToolTipText"); 

您可以创建一个inheritance自ToolTip的自定义ToolTip类(CustomToolTip)。 然后你必须处理OnDraw事件。 在该事件中,您可以更改字体。

在这里查看一个示例(有一个vb和c#示例)。

编辑

您必须自己处理自定义工具提示的呈现(IE:OnMouseOver,工具线程的OnMouseLeave事件)。 您可以创建一个使用自定义工具提示的customtoolstripmenuitem,但我不确定toolstripmenuitem是否公开了工具提示/对象。

我知道我在这一方上迟到了,但你可以使用reflection来设置用于渲染工具提示的ToolTip实例。 完成后,您可以像往常一样使用Draw方法。

 public void SetToolTipInstance(ToolStrip ts, ToolTip tt) { Type type = ts.GetType.BaseType; int propToolTip = Convert.ToInt32(type.GetField("PropToolTip", BindingFlags.NonPublic | BindingFlags.Static).GetValue(ts)); dynamic ps = type.BaseType.GetProperty("Properties", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ts); ps.GetType.GetMethod("SetObject", BindingFlags.Instance | BindingFlags.Public).Invoke(ps, {propToolTip,tt}); }