Изменить шрифт всплывающей подсказки - PullRequest
4 голосов
/ 20 августа 2010

Мне нужна всплывающая подсказка с пользовательским шрифтом.

У меня есть следующий код, и это работает ... но размер всплывающей подсказки не соответствует тексту.

Где ошибка?

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Size.Round (со страницы MSDN)

Преобразует указанную структуру SizeF в структуру Size, округляя значения структуры SizeF до ближайших целочисленных значений.

(мой акцент).

Следовательно, если

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

дает значения 23,4 и 42,1 (скажем), тогда они будут округлены до 23 и 42 соответственно, поэтому ваша подсказка будет немного слишком мала.

0 голосов
/ 01 сентября 2010

Не могли бы вы попытаться добавить логику изменения размера в событие OnResize в дополнение к событию OnDraw?Я думаю, что вы получите правильные значения на этом событии.Просто попробуйте и дайте знать, если это работает.

...