Использование регистрируемого шрифта

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Использование регистрируемого шрифта

Сообщение Qwertiy » 27.01.2012 (Пт) 18:01

Есть файл со шрифтом, надо сделать такой у контрола (или формы).
Если открыть Таблицу символов, то видно, что нужный шрифт регистрируется, но использовать его на форме не получается...
Код: Выделить всё
Public Class Form1

Private Declare Unicode Function AddFontResource Lib "gdi32" Alias "AddFontResourceW" (ByVal lpFileName As String) As Integer
Private Declare Unicode Function RemoveFontResource Lib "gdi32" Alias "RemoveFontResourceW" (ByVal lpFileName As String) As Integer

Private ReadOnly FontFile As String = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "Stone Handwriting.ttf")
Private ReadOnly FontName As String = "Stone Handwriting"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  AddFontResource(FontFile)
  Me.Font = New Font(FontName, 16)
End Sub

Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
  e.Graphics.DrawString(Me.Font.Name, Me.Font, Brushes.Black, 0, 0)
End Sub

Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
  RemoveFontResource(FontFile)
End Sub

End Class
Что тут не так? Не работает с любым шрифтом, не только с этим. В FontFamily.Families шрифта тоже нет.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.01.2012 (Пт) 19:43

Нашёл решение:
Код: Выделить всё
Imports System.Drawing.Text

Public Class Form1

Private ReadOnly FontFile As String = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "Stone Handwriting.ttf")

Private Fonts As New PrivateFontCollection

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Fonts.AddFontFile(FontFile)
  Me.Font = New Font(Fonts.Families(0), 16)
End Sub

Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
  e.Graphics.DrawString(Me.Font.Name, Me.Font, Brushes.Black, 0, 0)
End Sub

End Class

А как использовать шрифт, зарегистрированный с помощью AddFontResource?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Использование регистрируемого шрифта

Сообщение iGrok » 27.01.2012 (Пт) 20:15

В vb6 у меня первый вариант тоже не хотел работать. А вот AddFontResourceEx с FR_PRIVATE замечательно работал. Удалять его, разумеется, было не нужно.

Насколько я понимаю, PrivateFontCollection в итоге делает то же самое.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.01.2012 (Пт) 20:38

Но ведь другие программы шрифт видят! Т. е. дело не в регистрации, а в том, как к нему обратиться.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Использование регистрируемого шрифта

Сообщение Admiralisimys » 28.01.2012 (Сб) 0:08

Qwertiy чем не устраивает найденный способ?
Именно этот способ рекомендует MicroSoft, при переходе от Win32 к .NET Microsoft Win32 to Microsoft .NET Framework API Map -> Font and Text Functions
Или тут дело в том что какая прога подгрузила свой шрифт с помощью AddFontResource (исходников нет, это выяснено с помощью API Monitor) и есть желание на пару с ней этот шрифт использовать, а доступа к файлу шрифта этой проги нет?

iGrok да, именно так.
В методе AddFontFile класса PrivateFontCollection, после успешного выполнения GdiPlus функции GdipPrivateAddFontFile, идёт вызов упомянутой AddFontResourceEx(fileName, 16, IntPtr.Zero), где 16 теже 10 в шестнадцатеричной системе исчисления, что определены в макроподстановке FR_PRIVATE
Информация по ILSpy

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.01.2012 (Сб) 0:12

Admiralisimys писал(а):Qwertiy чем не устраивает найденный способ?

Ну, конкретно в данном случае устраивает.

Но вообще, все программы шрифт, зарегистрированный с помощью AddFontResource, видят. Хотелось бы, чтобы и я его тоже видел :)

По поводу .NET всё понятно - чем меньше WinApi, тем лучше.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList