2010-08-20 8 views
4

J'ai besoin d'une info-bulle avec une police personnalisée.Modifier la police de l'info-bulle

J'ai le code suivant, et cela fonctionne ... mais la taille de l'info-bulle ne correspond pas au texte.

Où est l'erreur?

Public Class KeolisTooltip 
    Inherits ToolTip 

    Sub New() 
    MyBase.New() 
    Me.OwnerDraw = True 
    AddHandler Me.Draw, AddressOf OnDraw 
    End Sub 

    Private _Font As Font 
    Public Property Font() As Font 
    Get 
     Return _Font 
    End Get 
    Set(ByVal value As Font) 
     _Font = value 
    End Set 
    End Property 

    Public Sub New(ByVal Cont As System.ComponentModel.IContainer) 
    MyBase.New(Cont) 
    Me.OwnerDraw = True 
    AddHandler Me.Draw, AddressOf OnDraw 
    End Sub 


    Private Sub OnDraw(ByVal sender As Object, ByVal e As DrawToolTipEventArgs) 
    Dim newArgs As DrawToolTipEventArgs 

    If _Font Is Nothing Then 
     newArgs = e 
    Else 
     Dim newSize As Size = Size.Round(e.Graphics.MeasureString(e.ToolTipText, Me._Font)) 
     Dim newBounds As New Rectangle(e.Bounds.Location, newSize) 

     newArgs = New DrawToolTipEventArgs(_ 
     e.Graphics, _ 
     e.AssociatedWindow, _ 
     e.AssociatedControl, _ 
     newBounds, _ 
     e.ToolTipText, _ 
     Me.BackColor, _ 
     Me.ForeColor, _ 
     Me._Font) 
    End If 

    newArgs.DrawBackground() 
    newArgs.DrawBorder() 
    newArgs.DrawText() 
    End Sub 

End Class 
+0

Je ne vois pas où vous êtes en train d'instancier la police. – JustBoo

+0

@JustBoo: remarque dans le code "Si _Font Is Nothing Then" – serhio

Répondre

2

Size.Round (à partir de la page MSDN)

convertit la structure de SizeF spécifiée à une structure de taille en arrondissant les valeurs de la structure SizeF aux valeurs entières les plus proches.

(mon emphase).

Par conséquent, si

e.Graphics.MeasureString(e.ToolTipText, Me._Font) 

produit des valeurs de 23,4 et 42,1 (par exemple), ils seront arrondis à 23 et 42 respectivement de sorte que votre infobulle sera légèrement trop petit.

+0

sow, quelle solution proposez-vous? – serhio

+0

@serhio - vous devez arrondir à l'entier supérieur le plus proche (ou même ajouter un peu plus de remplissage). – ChrisF

0

Pourriez-vous essayer d'ajouter la logique de redimensionnement à l'événement OnResize en plus de l'événement OnDraw? Je pense que vous obtiendrez les bonnes valeurs sur cet événement. Essayez juste et laissez savoir si cela fonctionne.