我有一个动态填充的ContextMenuStrip,其中每个ToolStripMenuItem都有一个工具提示的格式化文本。并且,为了使该文本对用户有意义,我必须使用等宽字体,例如“Courier New”。默认字体是常规非等宽字体。 我找不到ToolTip对象的任何getter,也没有办法覆盖它的Draw事件,也没有办法设置它的样式。
那么,甚至可以更改ToolStripMenuItem的工具提示字体吗?
实现继承自ToolTip的CustomToolTip无法解决问题,即将新工具提示传递给ToolStripMenuItem。
答案 0 :(得分:11)
好的,感谢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");
答案 1 :(得分:2)
您可以创建一个继承自ToolTip的自定义ToolTip类(CustomToolTip)。然后你必须处理OnDraw事件。在该事件中,您可以更改字体。
Look here示例(有一个vb和c#示例)。
修改强>
您必须自己处理自定义工具提示的呈现(IE:OnMouseOver,工具线程的OnMouseLeave事件)。您可能能够创建使用自定义工具提示的customtoolstripmenuitem,但我不确定toolstripmenuitem是否公开了工具提示的性能/对象。
答案 2 :(得分:0)
我知道我在这一方上有点迟到了,但您可以使用反射来设置用于渲染工具提示的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});
}