Пример: вывод всех шрифтов в системе
Ниже приведен полный код специализированного графического поля:
1 Public Class FontPictureBox 2 Inherits System.Windows.Forms.PictureBox 3 Protected Overrides Sub OnPaint(ByVal pe As _ System.Windows.Forms.PaintEventArgs) 4 ' Всегда вызывайте Mybase.OnPaint! 5 MyBase.OnPaint(pe) 6 DisplayFonts(pe.Graphics) 7 End Sub 8 Private Sub OisplayFonts(ByVal g As Graphics) 9 ' HE РАБОТАЕТ: Dim g As Graphics = Me.CreateGraphics() 10 Dim aFontFamily As FontFamily 11 Dim curx.curY As Single 12 Dim TheFonts As System.Drawing.Text.FontCollection 13 Dim tempFont As Font 14 Dim spacing As Integer = 2 ' Вывод с интервалом 2 пиксела 15 TheFonts =New System.Drawing.Text.InstalledFontCollection() 16 For Each aFontFamily In TheFonts.Families 17 Me.Height += 2 18 If aFontFamily.IsStyleAvailable(FontStyle.Regular) Then 19 tempFont =New Font(aFontFamily. 14. FontStyle.Regular) 20 Elself aFontFamily.IsStyleAvailable(FontStyle.Bold) Then 21 tempFont =New Font(aFontFamily, 14. FontStyle.Bold) 22 Elself aFontFamily.IsStyleAvailable(FontStyle.Italic) Then 23 tempFont =New Font(aFontFamily, 14. FontStyle.Italic) 24 End If 25 g.DrawString("Thls is displayed in " & aFontFamily.Name._ 26 tempFont. Brushes.Black, curx, curY) 27 DimtheSizeAs SizeF = g.MeasureString("This text is displayed in "_ 28 & aFontFamily.Name .tempFont) 29 curY = curY + theSize.Height + spacing 30 Me.Height = Me.Height + CIntCtheSize.Height) + spacing 31 Me.Width = Math.Max(CInt(theSize.Width). Me.Width) 32 Next 33 End Sub 34 End Class
Обратите внимание: в строке 6 функции Displayfonts, определяемой в строках 8-33, передается текущий графический контекст – вместо того, чтобы создавать новый графический контекст вызовом Me.CreateGraphics(). В исходной версии эта вспомогательная процедура получала собственный контекст вместо использования контекста ре.Graphics, переданного в объекте PaintEventArgs.
По каким-то загадочным причинам такое решение не работало. Закомментированный вызов Me.CreateGraphics0 остался в строке 9; при желании снимите комментарий и посмотрите, к чему это приведет.
При выводе текста необходимо знать высоту каждой строки. Высота вычисляется в строках 27 и 28 очень полезной функцией MeasureString:
Public Function MeasureString(String.Font) As SizeF
Функция возвращает объект класса SizeF – разновидность структуры Size, в которой вместо типа Integer используется тип Single. Поскольку класс SizeF содержит вещественные числа, в строках 30 и 31 преобразование осуществляется функцией CInt. В строке 30 происходит наращивание высоты графического поля, а строка 31 гарантирует, что ширина поля позволяет вместить самую длинную из выводимых строк. Проверка осуществляется методом Мах класса Math.