2011-01-11 30 views
5

Tengo un ContextMenuStrip dinámicamente lleno, donde cada ToolStripMenuItem tiene un texto con formato para la información sobre herramientas. Y, para que este texto tenga sentido para el usuario, debo usar una fuente monoespaciada, como "Courier New". La fuente predeterminada es una fuente regular, no monoespaciada. No pude encontrar ningún getter para el objeto ToolTip ni una forma de anular su evento Draw ni una forma de establecer su estilo.¿Es posible cambiar la fuente tooltip ToolStripMenuItem?

Por lo tanto, es incluso posible cambiar la fuente de información sobre herramientas ToolStripMenuItem?

La implementación de CustomToolTip que hereda de la información sobre herramientas no resuelve el problema, que está pasando la nueva información sobre herramientas a ToolStripMenuItem.

+0

sospecho que puede que tenga que utilizar uno de los muchos componentes de información sobre herramientas de terceros, tales como http://www.telerik.com – Lazarus

+0

Por desgracia, no puedo utilizar cualquier componente de terceros. – ElyaSh

+0

Algo no tiene sentido aquí. Has etiquetado la pregunta WPF, pero estás hablando de un control 'ToolStripMenuItem'. Ese es un control de WinForms. ¿Qué estás usando? Sospecho que hace una gran diferencia. –

Respuesta

2

Se puede crear una clase de herramientas personalizadas (CustomToolTip) que hereda de información sobre herramientas. Entonces tendría que manejar el evento OnDraw. Dentro de ese evento puedes cambiar la fuente.

Look here para un ejemplo (hay un ejemplo de vb y C#).

EDITAR

Usted tendría que manejar la prestación de la información sobre herramientas personalizada en su propio (IE: Onmouseover, eventos OnMouseLeave del ToolStripMenuItem). Es posible que pueda crear un elemento personalizado de tira de herramientas que utilice una información sobre herramientas personalizada, pero no estoy seguro de que toolstripmenuitem expone una herramienta de herramientas propety/object.

+0

El problema no está en heredar de ToolTip, sino en proporcionarlo a ToolStripMenuItem. – ElyaSh

+0

Tendría que manejar la prestación de la información personalizada sobre herramientas por su cuenta (IE: OnMouseOver, OnMouseLeave events of the toolstripmenuitem). Es posible que pueda crear un elemento personalizado de tira de herramientas que utilice una información sobre herramientas personalizada, pero no estoy seguro de que toolstripmenuitem expone una herramienta de herramientas propety/object. –

+0

toolstripmenuitem no exponer un tooltip propety/object es la razón principal por la que decidí hacer la pregunta aquí. – ElyaSh

10

OK, gracias a Tony Abrams y William Andrus, la solución es la siguiente:

  • Un ejemplo estático de información sobre herramientas que inicializa. evento Emergente

    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; 
    
  • de información sobre herramientas para ajustar su tamaño.

    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's Draw event for real drawing.

    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); 
    } 
    
  • caso MouseEnter de ToolStripMenuItem para mostrar la información sobre herramientas.

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Show("ToolTipText", item.Owner); 
    
  • caso MouseLeave de ToolStripMenuItem para ocultar la información sobre herramientas.

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Hide(item.Owner); 
    
+1

+1 ¡Gracias por publicar la solución final! De esa forma, si alguien más llega aquí con la misma pregunta, ellos sabrán cómo lo resolvió. También formateé el código por ti. El truco para conseguir que el formateo funcione dentro de las viñetas es sangrar 8 espacios, en lugar de los 4 normales. –

+0

Estaba buscando una solución para un problema levemente relacionado: mostrar una información sobre herramientas con texto personalizado en algunos botones de una tira de herramientas, pero no en todos ellos No necesitaba el dibujo personalizado, pero deshabilitaba la información sobre herramientas incorporada en la tira de herramientas, y el manejo de MouseEnter y MouseLeave de ToolStripMenuItem para mostrar el texto de información sobre herramientas del elemento si no era nulo o estaba vacío, funcionaba muy bien. – neminem

+0

Funcionó muy bien para mí, aunque en algunas situaciones terminé con una información sobre herramientas adicional (en blanco), esto parecía ser cuando mi ventana redibujó los controles de botón que usaban la información sobre herramientas). Para resolver esto me aseguré de que mi MouseLeave eliminó la información sobre herramientas y recreó la información sobre herramientas en MouseHover. Obviamente necesitaba una referencia fuera de ambos oyentes para que eso funcione. –

0

Yo sé que soy un poco tarde a la fiesta en este caso, pero se puede utilizar la reflexión para establecer la instancia de información sobre herramientas que se utiliza para representar la información sobre herramientas. Después de hacer eso, puedes usar el método Draw como lo harías normalmente.

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}); 
} 
Cuestiones relacionadas